From 91faa4dfe3c2740e5595f9410ca19e830777049e Mon Sep 17 00:00:00 2001 From: Valentin Valls Date: Fri, 17 May 2019 10:18:11 +0200 Subject: [PATCH 1/9] Fix doc on python modules --- pyFAI/app/average.py | 6 +++--- pyFAI/engines/preproc.py | 12 ++++------- pyFAI/ext/__init__.py | 29 +++++++++++++++++++++++++++ pyFAI/ext/_bispev.pyx | 12 ++++++----- pyFAI/ext/_blob.pyx | 8 ++++++-- pyFAI/ext/_convolution.pyx | 8 ++++++-- pyFAI/ext/_distortion.pyx | 6 +++++- pyFAI/ext/_geometry.pyx | 8 +++++++- pyFAI/ext/_tree.pyx | 5 ++++- pyFAI/ext/bilinear.pyx | 5 ++++- pyFAI/ext/histogram.pyx | 9 +++++++-- pyFAI/ext/invert_geometry.pyx | 8 +++++++- pyFAI/ext/morphology.pyx | 7 +++++-- pyFAI/ext/preproc.pyx | 6 +++++- pyFAI/ext/reconstruct.pyx | 8 ++++++-- pyFAI/ext/relabel.pyx | 7 +++++-- pyFAI/ext/watershed.pyx | 5 +++-- pyFAI/gui/matplotlib.py | 4 +++- pyFAI/gui/model/ListModel.py | 6 +++--- pyFAI/gui/model/PeakModel.py | 4 ++-- pyFAI/gui/tasks/IntegrationTask.py | 6 +++--- pyFAI/gui/utils/timeutils.py | 5 +++-- pyFAI/gui/widgets/AdvancedComboBox.py | 4 ++-- pyFAI/opencl/__init__.py | 4 +++- pyFAI/resources/__init__.py | 21 ++++++++++--------- pyFAI/utils/__init__.py | 4 ++-- pyFAI/utils/bayes.py | 9 +++++---- pyFAI/utils/shell.py | 4 ++-- pyFAI/utils/stringutil.py | 4 ++-- 29 files changed, 155 insertions(+), 69 deletions(-) diff --git a/pyFAI/app/average.py b/pyFAI/app/average.py index de323fdb..fbb3d831 100755 --- a/pyFAI/app/average.py +++ b/pyFAI/app/average.py @@ -33,7 +33,7 @@ __author__ = "Jerome Kieffer, Picca Frédéric-Emmanuel" __contact__ = "Jerome.Kieffer@ESRF.eu" __license__ = "MIT" __copyright__ = "European Synchrotron Radiation Facility, Grenoble, France" -__date__ = "01/03/2019" +__date__ = "17/05/2019" __status__ = "production" import os @@ -99,8 +99,8 @@ def parse_algorithms(options): def cleanup_input_paths(input_paths): """Clean up filename using :: to access to data inside file. - :returns: Returns a list of paths without directory separator inside the filename - location. + :returns: Returns a list of paths without directory separator inside the + filename location. """ result = [] for path in input_paths: diff --git a/pyFAI/engines/preproc.py b/pyFAI/engines/preproc.py index 7bdfa63d..44970f39 100644 --- a/pyFAI/engines/preproc.py +++ b/pyFAI/engines/preproc.py @@ -25,9 +25,7 @@ # THE SOFTWARE. -"""Pre-Processing - -A module for all common pixel-wise pre-processing of data. +"""Module providing common pixel-wise pre-processing of data. """ from __future__ import absolute_import, print_function, with_statement @@ -36,7 +34,7 @@ __author__ = "Jerome Kieffer" __contact__ = "Jerome.Kieffer@ESRF.eu" __license__ = "MIT" __copyright__ = "European Synchrotron Radiation Facility, Grenoble, France" -__date__ = "06/05/2019" +__date__ = "17/05/2019" __status__ = "development" import warnings @@ -87,10 +85,8 @@ def preproc(raw, NaN are always considered as invalid values if neither empty nor dummy is provided, empty pixels are 0. - Empty pixels are always zero in "split_result" mode + Empty pixels are always zero in "split_result" mode. - Split result: - ------------- When set to False, i.e the default, the pixel-wise operation is: I = (raw - dark)/(flat \* solidangle \* polarization \* absorption) Invalid pixels are set to the dummy or empty value. @@ -100,7 +96,7 @@ def preproc(raw, I = [(raw - dark), (variance), (flat \* solidangle \* polarization \* absorption)] Empty pixels will have all their 2 or 3 values to 0 (and not to dummy or empty value) - If poissonian is set to True, the variance is evaluated as (raw + dark) + If poissonian is set to True, the variance is evaluated as (raw + dark). """ if isinstance(dtype, str): dtype = numpy.dtype(dtype).type diff --git a/pyFAI/ext/__init__.py b/pyFAI/ext/__init__.py index e69de29b..93148893 100644 --- a/pyFAI/ext/__init__.py +++ b/pyFAI/ext/__init__.py @@ -0,0 +1,29 @@ +# coding: utf-8 +# /*########################################################################## +# +# Copyright (C) 2016-2018 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. +# +# ###########################################################################*/ + +"""Package containing all Cython binary extensions""" + +__copyright__ = "European Synchrotron Radiation Facility, Grenoble, France" +__license__ = "MIT" diff --git a/pyFAI/ext/_bispev.pyx b/pyFAI/ext/_bispev.pyx index b643f17b..7c00e5b0 100644 --- a/pyFAI/ext/_bispev.pyx +++ b/pyFAI/ext/_bispev.pyx @@ -25,14 +25,14 @@ # 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. -'''Spline evaluation function -Created on Nov 4, 2013 -''' + +"""Module containing a re-implementation of bi-cubic spline evaluation from +scipy.""" __authors__ = ["Zubair Nawaz", "Jerome Kieffer"] __contact__ = "Jerome.kieffer@esrf.fr" -__date__ = "15/11/2018" +__date__ = "17/05/2019" __status__ = "stable" __license__ = "MIT" @@ -51,13 +51,15 @@ def bisplev(x, y, tck, dx=0, dy=0): Return a rank-2 array of spline function values (or spline derivative values) at points given by the cross-product of the rank-1 arrays x and y. In special cases, return an array or just a float if either x or y or - both are floats. Based on BISPEV from FITPACK. + both are floats. Based on BISPEV from FITPACK. See :func:`bisplrep` to generate the `tck` representation. See also :func:`splprep`, :func:`splrep`, :func:`splint`, :func:`sproot`, :func:`splev`, :func:`UnivariateSpline`, :func:`BivariateSpline` + References: [1]_, [2]_, [3]_. + .. [1] Dierckx P. : An algorithm for surface fitting with spline functions Ima J. Numer. Anal. 1 (1981) 267-283. diff --git a/pyFAI/ext/_blob.pyx b/pyFAI/ext/_blob.pyx index 924e3daf..da6267cb 100644 --- a/pyFAI/ext/_blob.pyx +++ b/pyFAI/ext/_blob.pyx @@ -25,12 +25,16 @@ # 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. + """ -Some Cythonized function for blob detection function +Some Cythonized function for blob detection function. + +It is used to find peaks in images by performing subsequent blurs. """ + __authors__ = ["Aurore Deschildre", "Jerome Kieffer"] __contact__ = "Jerome.kieffer@esrf.fr" -__date__ = "10/01/2018" +__date__ = "17/05/2019" __status__ = "stable" __license__ = "MIT" import cython diff --git a/pyFAI/ext/_convolution.pyx b/pyFAI/ext/_convolution.pyx index b9cdcbff..bb7c0c3f 100644 --- a/pyFAI/ext/_convolution.pyx +++ b/pyFAI/ext/_convolution.pyx @@ -26,11 +26,15 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -"""Implementation of a separable 2D convolution""" +"""Implementation of a separable 2D convolution. + +It is used in real space are used to blurs images, used in blob-detection +algorithm. +""" __authors__ = ["Pierre Paleo", "Jerome Kieffer"] __contact__ = "Jerome.kieffer@esrf.fr" -__date__ = "01/12/2016" +__date__ = "17/05/2019" __status__ = "stable" __license__ = "MIT" import cython diff --git a/pyFAI/ext/_distortion.pyx b/pyFAI/ext/_distortion.pyx index fef6c793..7ca923cc 100644 --- a/pyFAI/ext/_distortion.pyx +++ b/pyFAI/ext/_distortion.pyx @@ -26,9 +26,13 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. +""" +Distortion correction are correction are applied by look-up table (or CSR) +""" + __author__ = "Jerome Kieffer" __license__ = "MIT" -__date__ = "21/01/2019" +__date__ = "17/05/2019" __copyright__ = "2011-2018, ESRF" __contact__ = "jerome.kieffer@esrf.fr" diff --git a/pyFAI/ext/_geometry.pyx b/pyFAI/ext/_geometry.pyx index 03bd29f6..d8df1408 100644 --- a/pyFAI/ext/_geometry.pyx +++ b/pyFAI/ext/_geometry.pyx @@ -26,9 +26,15 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. +""" +This extension is a fast-implementation for calculating the geometry, i.e. where +every pixel of an array stays in space (x,y,z) or its (r, :math:`\\chi`) +coordinates. +""" + __author__ = "Jerome Kieffer" __license__ = "MIT" -__date__ = "26/10/2018" +__date__ = "17/05/2019" __copyright__ = "2011-2016, ESRF" __contact__ = "jerome.kieffer@esrf.fr" diff --git a/pyFAI/ext/_tree.pyx b/pyFAI/ext/_tree.pyx index 149228df..04de9254 100644 --- a/pyFAI/ext/_tree.pyx +++ b/pyFAI/ext/_tree.pyx @@ -26,9 +26,12 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. +"""Module used in file hierarchy tree for the diff_map graphical user interface. +""" + __author__ = "Jerome Kieffer" __license__ = "MIT" -__date__ = "09/01/2018" +__date__ = "17/05/2019" __copyright__ = "2011-2015, ESRF" __contact__ = "jerome.kieffer@esrf.fr" diff --git a/pyFAI/ext/bilinear.pyx b/pyFAI/ext/bilinear.pyx index f6cecb4f..d9971b6f 100644 --- a/pyFAI/ext/bilinear.pyx +++ b/pyFAI/ext/bilinear.pyx @@ -25,10 +25,13 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. +"""Module with makes a discrete 2D-array appear like a continuous function thanks +to bilinear interpolations. +""" __author__ = "Jerome Kieffer" __license__ = "MIT" -__date__ = "18/04/2019" +__date__ = "17/05/2019" __copyright__ = "2011-2015, ESRF" __contact__ = "jerome.kieffer@esrf.fr" diff --git a/pyFAI/ext/histogram.pyx b/pyFAI/ext/histogram.pyx index 54ceefe0..6052d8b4 100644 --- a/pyFAI/ext/histogram.pyx +++ b/pyFAI/ext/histogram.pyx @@ -26,10 +26,15 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -"""A set of histogram functions with or without OpenMP enabled.""" +"""A set of histogram functions with or without OpenMP enabled. + +Re-implementation of the numpy.histogram, optimized for azimuthal integration. + +Deprecated, will be replaced by ``silx.math.histogramnd``. +""" __author__ = "Jerome Kieffer" -__date__ = "06/05/2019" +__date__ = "17/05/2019" __license__ = "MIT" __copyright__ = "2011-2019, ESRF" __contact__ = "jerome.kieffer@esrf.fr" diff --git a/pyFAI/ext/invert_geometry.pyx b/pyFAI/ext/invert_geometry.pyx index c41267f3..ab0c62ad 100644 --- a/pyFAI/ext/invert_geometry.pyx +++ b/pyFAI/ext/invert_geometry.pyx @@ -25,9 +25,15 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. + +""" +Module providing inversion transformation from pixel coordinate to radial/azimuthal +coordinate. +""" + __author__ = "Jerome Kieffer" __license__ = "MIT" -__date__ = "06/05/2019" +__date__ = "17/05/2019" __copyright__ = "2018-2018, ESRF" __contact__ = "jerome.kieffer@esrf.fr" diff --git a/pyFAI/ext/morphology.pyx b/pyFAI/ext/morphology.pyx index ad22d27c..fdc14a00 100644 --- a/pyFAI/ext/morphology.pyx +++ b/pyFAI/ext/morphology.pyx @@ -26,12 +26,15 @@ # THE SOFTWARE. """ -A few binary morphology operation +This module provides a couple of binary morphology operations on images. + +They are also implemented in ``scipy.ndimage`` in the general case, but not as +fast. """ __author__ = "Jerome Kieffer" __contact__ = "Jerome.kieffer@esrf.fr" -__date__ = "09/01/2018" +__date__ = "17/05/2019" __status__ = "stable" __license__ = "MIT" diff --git a/pyFAI/ext/preproc.pyx b/pyFAI/ext/preproc.pyx index 4cf194bc..711d365e 100644 --- a/pyFAI/ext/preproc.pyx +++ b/pyFAI/ext/preproc.pyx @@ -25,10 +25,14 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. +""" +Contains a preprocessing function in charge of the dark-current subtraction, +flat-field normalization... taking care of masked values and normalization. +""" __author__ = "Jerome Kieffer" __license__ = "MIT" -__date__ = "06/05/2019" +__date__ = "17/05/2019" __copyright__ = "2011-2018, ESRF" __contact__ = "jerome.kieffer@esrf.fr" diff --git a/pyFAI/ext/reconstruct.pyx b/pyFAI/ext/reconstruct.pyx index d6ba85ef..cde75121 100644 --- a/pyFAI/ext/reconstruct.pyx +++ b/pyFAI/ext/reconstruct.pyx @@ -25,11 +25,15 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -"""Cython module to reconstruct the masked values of an image""" +"""Cython module to reconstruct the masked values of an image. + +It's a simple inpainting module for reconstructing the missing part of an +image (masked) to be able to use more common algorithms. +""" __author__ = "Jerome Kieffer" __contact__ = "Jerome.kieffer@esrf.fr" -__date__ = "15/11/2018" +__date__ = "17/05/2019" __status__ = "stable" __license__ = "MIT" diff --git a/pyFAI/ext/relabel.pyx b/pyFAI/ext/relabel.pyx index 518352f0..c4c45bea 100644 --- a/pyFAI/ext/relabel.pyx +++ b/pyFAI/ext/relabel.pyx @@ -26,11 +26,14 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -"""A module to relabel regions""" +"""Module providing features to relabel regions. + +It is used to flag from largest regions to the smallest. +""" __author__ = "Jerome Kieffer" __contact__ = "Jerome.kieffer@esrf.fr" -__date__ = "15/11/2018" +__date__ = "17/05/2019" __status__ = "stable" __license__ = "MIT" diff --git a/pyFAI/ext/watershed.pyx b/pyFAI/ext/watershed.pyx index dd7db02f..595dc29f 100644 --- a/pyFAI/ext/watershed.pyx +++ b/pyFAI/ext/watershed.pyx @@ -26,11 +26,12 @@ # THE SOFTWARE. # -"""Inverse watershed for connecting region of high intensity +"""Peak peaking via inverse watershed for connecting region of high intensity """ + __author__ = "Jerome Kieffer" __contact__ = "Jerome.kieffer@esrf.fr" -__date__ = "11/01/2018" +__date__ = "17/05/2019" __status__ = "stable" __license__ = "MIT" diff --git a/pyFAI/gui/matplotlib.py b/pyFAI/gui/matplotlib.py index bda722b7..fbbf571e 100644 --- a/pyFAI/gui/matplotlib.py +++ b/pyFAI/gui/matplotlib.py @@ -22,6 +22,7 @@ # THE SOFTWARE. # # ###########################################################################*/ + """This module inits matplotlib and setups the backend to use. It MUST be imported prior to any other import of matplotlib. @@ -29,11 +30,12 @@ It MUST be imported prior to any other import of matplotlib. It provides the matplotlib :class:`FigureCanvasQTAgg` class corresponding to the used backend. """ + from __future__ import absolute_import __authors__ = ["T. Vincent"] __license__ = "MIT" -__date__ = "20/02/2018" +__date__ = "17/05/2019" import sys diff --git a/pyFAI/gui/model/ListModel.py b/pyFAI/gui/model/ListModel.py index c1312d72..007e29ee 100644 --- a/pyFAI/gui/model/ListModel.py +++ b/pyFAI/gui/model/ListModel.py @@ -27,7 +27,7 @@ from __future__ import absolute_import __authors__ = ["V. Valls"] __license__ = "MIT" -__date__ = "11/04/2019" +__date__ = "17/05/2019" import functools @@ -41,8 +41,8 @@ class ChangeEvent(object): """ Define a change done on an item from the :class:`ListModel`. - :param int index, The location where to put/remove the item (before the change) - or the current index of the changed item + :param int index: The location where to put/remove the item (before the + change) or the current index of the changed item :param object item: The item involved in this change :param bool updated: True if the item was changed :param bool added: True if the item was added diff --git a/pyFAI/gui/model/PeakModel.py b/pyFAI/gui/model/PeakModel.py index e42be003..d1620ac2 100644 --- a/pyFAI/gui/model/PeakModel.py +++ b/pyFAI/gui/model/PeakModel.py @@ -27,7 +27,7 @@ from __future__ import absolute_import __authors__ = ["V. Valls"] __license__ = "MIT" -__date__ = "07/05/2019" +__date__ = "17/05/2019" import numpy from .AbstractModel import AbstractModel @@ -91,7 +91,7 @@ class PeakModel(AbstractModel): List of axis/ord can be reached like that. - .. code-block:: + .. code-block:: python coords = group.coords() yy = coords[:, 0] diff --git a/pyFAI/gui/tasks/IntegrationTask.py b/pyFAI/gui/tasks/IntegrationTask.py index 09e1a1b5..ddbdae90 100644 --- a/pyFAI/gui/tasks/IntegrationTask.py +++ b/pyFAI/gui/tasks/IntegrationTask.py @@ -27,7 +27,7 @@ from __future__ import absolute_import __authors__ = ["V. Valls"] __license__ = "MIT" -__date__ = "16/05/2019" +__date__ = "17/05/2019" import logging import numpy @@ -767,8 +767,8 @@ class IntegrationPlot(qt.QFrame): def setIntegrationProcess(self, integrationProcess): """ - :param IntegrationProcess integrationProcess: Result of the integration - process + :param :class:`~pyFAI.gui.tasks.IntegrationTask.IntegrationProcess` integrationProcess: + Result of the integration process """ self.__clearRings() diff --git a/pyFAI/gui/utils/timeutils.py b/pyFAI/gui/utils/timeutils.py index f4f1745f..1ed17e51 100644 --- a/pyFAI/gui/utils/timeutils.py +++ b/pyFAI/gui/utils/timeutils.py @@ -30,7 +30,7 @@ from __future__ import division __authors__ = ["V. Valls"] __license__ = "MIT" -__date__ = "05/11/2018" +__date__ = "17/05/2019" import logging @@ -43,7 +43,8 @@ class Timer(object): """Kind of context manager to call a code while the amount of seconds is not finished. - .. code-block:: + .. code-block:: python + timer = Timer(seconds=10) while not timer.isTimeout(): print("Tick") diff --git a/pyFAI/gui/widgets/AdvancedComboBox.py b/pyFAI/gui/widgets/AdvancedComboBox.py index 063253db..3b812686 100644 --- a/pyFAI/gui/widgets/AdvancedComboBox.py +++ b/pyFAI/gui/widgets/AdvancedComboBox.py @@ -27,7 +27,7 @@ from __future__ import absolute_import __authors__ = ["V. Valls"] __license__ = "MIT" -__date__ = "25/04/2019" +__date__ = "17/05/2019" import logging @@ -139,7 +139,7 @@ class AdvancedComboBox(qt.QComboBox): Only `qt.Qt.DisplayRole` and `qt.Qt.DecorationRole` are supported. - .. code-block:: + .. code-block:: python def displayedData(widget, row, role=qt.Qt.DisplayRole): if role == qt.Qt.DisplayRole: diff --git a/pyFAI/opencl/__init__.py b/pyFAI/opencl/__init__.py index 4f5bfb22..4ae9ec04 100644 --- a/pyFAI/opencl/__init__.py +++ b/pyFAI/opencl/__init__.py @@ -30,11 +30,13 @@ # OTHER DEALINGS IN THE SOFTWARE. # +"""Contains all OpenCL implementation.""" + __author__ = "Jerome Kieffer" __contact__ = "Jerome.Kieffer@ESRF.eu" __license__ = "MIT" __copyright__ = "2012-2017 European Synchrotron Radiation Facility, Grenoble, France" -__date__ = "25/02/2019" +__date__ = "17/05/2019" __status__ = "stable" import os diff --git a/pyFAI/resources/__init__.py b/pyFAI/resources/__init__.py index 00eefa9e..ac13038a 100644 --- a/pyFAI/resources/__init__.py +++ b/pyFAI/resources/__init__.py @@ -34,26 +34,29 @@ of this modules to ensure access across different distribution schemes: - Frozen fat binary application using pyFAI (frozen with cx_Freeze or py2app). This needs special care for the resource files in the setup: - - With cx_Freeze, add pyFAI/resources to include_files:: +- With cx_Freeze, add pyFAI/resources to include_files: + +.. code-block:: python import pyFAI.resources pyFAI_include_files = (os.path.dirname(pyFAI.resources.__file__), os.path.join('pyFAI', 'resources')) - setup(... - options={'build_exe': {'include_files': [pyFAI_include_files]}} - ) + setup(..., + options={'build_exe': {'include_files': [pyFAI_include_files]}} + ) +- With py2app, add pyFAI in the packages list of the py2app options: - - With py2app, add pyFAI in the packages list of the py2app options:: +.. code-block:: python - setup(... - options={'py2app': {'packages': ['pyFAI']}} - ) + setup(..., + options={'py2app': {'packages': ['pyFAI']}} + ) """ __authors__ = ["V.A. Sole", "Thomas Vincent"] __license__ = "MIT" -__date__ = "20/02/2018" +__date__ = "17/05/2019" import os diff --git a/pyFAI/utils/__init__.py b/pyFAI/utils/__init__.py index 891ae642..e9aee24a 100644 --- a/pyFAI/utils/__init__.py +++ b/pyFAI/utils/__init__.py @@ -27,14 +27,14 @@ # THE SOFTWARE. """ -Utilities +Module with miscelaneous tools """ __author__ = "Jerome Kieffer" __contact__ = "Jerome.Kieffer@ESRF.eu" __license__ = "MIT" __copyright__ = "European Synchrotron Radiation Facility, Grenoble, France" -__date__ = "04/10/2018" +__date__ = "17/05/2019" __status__ = "production" import logging diff --git a/pyFAI/utils/bayes.py b/pyFAI/utils/bayes.py index f0569735..7b2e3b38 100644 --- a/pyFAI/utils/bayes.py +++ b/pyFAI/utils/bayes.py @@ -23,11 +23,12 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -""" Bayesian evaluation of background for 1D powder diffraction pattern +"""Bayesian evaluation of background for 1D powder diffraction pattern. Code according to Sivia and David, J. Appl. Cryst. (2001). 34, 318-324 -# Version: 0.1 2012/03/28 -# Version: 0.2 2016/10/07: OOP implementation + +* Version: 0.1 2012/03/28 +* Version: 0.2 2016/10/07: OOP implementation """ from __future__ import absolute_import, print_function, division @@ -35,7 +36,7 @@ from __future__ import absolute_import, print_function, division __authors__ = ["Vincent Favre-Nicolin", "Jérôme Kieffer"] __license__ = "MIT" __copyright__ = "European Synchrotron Radiation Facility, Grenoble, France" -__date__ = "09/01/2018" +__date__ = "17/05/2019" __status__ = "development" __docformat__ = 'restructuredtext' diff --git a/pyFAI/utils/shell.py b/pyFAI/utils/shell.py index 826341f5..77fd87f1 100644 --- a/pyFAI/utils/shell.py +++ b/pyFAI/utils/shell.py @@ -23,14 +23,14 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -"""Module containing utilities around shell""" +"""Module containing utilities around shell command line.""" from __future__ import absolute_import, print_function, division __author__ = "valentin.valls@esrf.eu" __license__ = "MIT" __copyright__ = "European Synchrotron Radiation Facility, Grenoble, France" -__date__ = "25/02/2019" +__date__ = "17/05/2019" __status__ = "development" __docformat__ = 'restructuredtext' diff --git a/pyFAI/utils/stringutil.py b/pyFAI/utils/stringutil.py index a986a3ec..293a5863 100644 --- a/pyFAI/utils/stringutil.py +++ b/pyFAI/utils/stringutil.py @@ -26,12 +26,12 @@ from __future__ import absolute_import, print_function, division -"""Module containing utilitary around string""" +"""Module containing enhanced string formatters.""" __author__ = "valentin.valls@esrf.eu" __license__ = "MIT" __copyright__ = "European Synchrotron Radiation Facility, Grenoble, France" -__date__ = "16/05/2019" +__date__ = "17/05/2019" __status__ = "development" __docformat__ = 'restructuredtext' From 66d7e5bb404487d76781f1853a890d0cc481e9f5 Mon Sep 17 00:00:00 2001 From: Valentin Valls Date: Fri, 17 May 2019 10:18:18 +0200 Subject: [PATCH 2/9] Fix ref --- doc/source/geometry_conversion.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/source/geometry_conversion.rst b/doc/source/geometry_conversion.rst index 78aede14..d27ef586 100644 --- a/doc/source/geometry_conversion.rst +++ b/doc/source/geometry_conversion.rst @@ -3,6 +3,8 @@ :Keywords: geometry conversion from/to pyFAI :Target: developers +.. _geometryconversion: + The purpose of this note is to compare how ``pyFAI`` and ``ImageD11`` treat the detector position. In particular, we derive how “PONI” detector parameters refined with ``pyFAI`` can be transformed into From f9d383c5096a8eb5054bbbb81d564dcf957df142 Mon Sep 17 00:00:00 2001 From: Valentin Valls Date: Fri, 17 May 2019 10:19:00 +0200 Subject: [PATCH 3/9] Update the API doc --- doc/source/api/app/index.rst | 142 +++++++++++ doc/source/api/detectors/index.rst | 10 + doc/source/api/engines/index.rst | 38 +++ doc/source/api/ext/index.rst | 224 ++++++++++++++++++ doc/source/api/gui/dialog.rst | 62 +++++ doc/source/api/gui/helper.rst | 78 ++++++ doc/source/api/gui/index.rst | 106 +++++++++ doc/source/api/gui/model.rst | 182 ++++++++++++++ doc/source/api/gui/tasks.rst | 62 +++++ doc/source/api/gui/utils.rst | 107 +++++++++ doc/source/api/gui/widgets.rst | 198 ++++++++++++++++ doc/source/api/io/index.rst | 38 +++ doc/source/api/opencl/index.rst | 75 ++++++ doc/source/api/pyFAI.rst | 365 ++--------------------------- doc/source/api/resources/index.rst | 22 ++ doc/source/api/utils/index.rst | 91 +++++++ 16 files changed, 1452 insertions(+), 348 deletions(-) create mode 100644 doc/source/api/app/index.rst create mode 100644 doc/source/api/detectors/index.rst create mode 100644 doc/source/api/engines/index.rst create mode 100644 doc/source/api/ext/index.rst create mode 100644 doc/source/api/gui/dialog.rst create mode 100644 doc/source/api/gui/helper.rst create mode 100644 doc/source/api/gui/index.rst create mode 100644 doc/source/api/gui/model.rst create mode 100644 doc/source/api/gui/tasks.rst create mode 100644 doc/source/api/gui/utils.rst create mode 100644 doc/source/api/gui/widgets.rst create mode 100644 doc/source/api/io/index.rst create mode 100644 doc/source/api/opencl/index.rst create mode 100644 doc/source/api/resources/index.rst create mode 100644 doc/source/api/utils/index.rst diff --git a/doc/source/api/app/index.rst b/doc/source/api/app/index.rst new file mode 100644 index 00000000..ad1ab08b --- /dev/null +++ b/doc/source/api/app/index.rst @@ -0,0 +1,142 @@ +pyFAI.app package +================= + +Submodules +---------- + +pyFAI.app.average module +------------------------ + +.. automodule:: pyFAI.app.average + :members: + :undoc-members: + :show-inheritance: + +pyFAI.app.benchmark module +-------------------------- + +.. automodule:: pyFAI.app.benchmark + :members: + :undoc-members: + :show-inheritance: + +pyFAI.app.calib module +---------------------- + +.. automodule:: pyFAI.app.calib + :members: + :undoc-members: + :show-inheritance: + +pyFAI.app.calib2 module +----------------------- + +.. automodule:: pyFAI.app.calib2 + :members: + :undoc-members: + :show-inheritance: + +pyFAI.app.check_calib module +---------------------------- + +.. automodule:: pyFAI.app.check_calib + :members: + :undoc-members: + :show-inheritance: + +pyFAI.app.detector2nexus module +------------------------------- + +.. automodule:: pyFAI.app.detector2nexus + :members: + :undoc-members: + :show-inheritance: + +pyFAI.app.diff_map module +------------------------- + +.. automodule:: pyFAI.app.diff_map + :members: + :undoc-members: + :show-inheritance: + +pyFAI.app.diff_tomo module +-------------------------- + +.. automodule:: pyFAI.app.diff_tomo + :members: + :undoc-members: + :show-inheritance: + +pyFAI.app.drawmask module +------------------------- + +.. automodule:: pyFAI.app.drawmask + :members: + :undoc-members: + :show-inheritance: + +pyFAI.app.eiger_mask module +--------------------------- + +.. automodule:: pyFAI.app.eiger_mask + :members: + :undoc-members: + :show-inheritance: + +pyFAI.app.integrate module +-------------------------- + +.. automodule:: pyFAI.app.integrate + :members: + :undoc-members: + :show-inheritance: + +pyFAI.app.mx_calibrate module +----------------------------- + +.. automodule:: pyFAI.app.mx_calibrate + :members: + :undoc-members: + :show-inheritance: + +pyFAI.app.recalib module +------------------------ + +.. automodule:: pyFAI.app.recalib + :members: + :undoc-members: + :show-inheritance: + +pyFAI.app.saxs module +--------------------- + +.. automodule:: pyFAI.app.saxs + :members: + :undoc-members: + :show-inheritance: + +pyFAI.app.setup module +---------------------- + +.. automodule:: pyFAI.app.setup + :members: + :undoc-members: + :show-inheritance: + +pyFAI.app.waxs module +--------------------- + +.. automodule:: pyFAI.app.waxs + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: pyFAI.app + :members: + :undoc-members: + :show-inheritance: diff --git a/doc/source/api/detectors/index.rst b/doc/source/api/detectors/index.rst new file mode 100644 index 00000000..c6137a6c --- /dev/null +++ b/doc/source/api/detectors/index.rst @@ -0,0 +1,10 @@ +pyFAI.detectors package +======================= + +Module contents +--------------- + +.. automodule:: pyFAI.detectors + :members: + :undoc-members: + :show-inheritance: diff --git a/doc/source/api/engines/index.rst b/doc/source/api/engines/index.rst new file mode 100644 index 00000000..6fc33d55 --- /dev/null +++ b/doc/source/api/engines/index.rst @@ -0,0 +1,38 @@ +pyFAI.engines package +===================== + +Submodules +---------- + +pyFAI.engines.CSR_engine module +------------------------------- + +.. automodule:: pyFAI.engines.CSR_engine + :members: + :undoc-members: + :show-inheritance: + +pyFAI.engines.histogram_engine module +------------------------------------- + +.. automodule:: pyFAI.engines.histogram_engine + :members: + :undoc-members: + :show-inheritance: + +pyFAI.engines.preproc module +---------------------------- + +.. automodule:: pyFAI.engines.preproc + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: pyFAI.engines + :members: + :undoc-members: + :show-inheritance: diff --git a/doc/source/api/ext/index.rst b/doc/source/api/ext/index.rst new file mode 100644 index 00000000..92a2f2da --- /dev/null +++ b/doc/source/api/ext/index.rst @@ -0,0 +1,224 @@ +pyFAI.ext package +================= + +Submodules +---------- + +pyFAI.ext.bilinear module +------------------------- + +.. automodule:: pyFAI.ext.bilinear + :members: + :undoc-members: + :show-inheritance: + +pyFAI.ext.fastcrc module +------------------------ + +.. automodule:: pyFAI.ext.fastcrc + :members: + :undoc-members: + :show-inheritance: + +pyFAI.ext.histogram module +-------------------------- + +.. automodule:: pyFAI.ext.histogram + :members: + :undoc-members: + :show-inheritance: + +pyFAI.ext.inpainting module +--------------------------- + +.. automodule:: pyFAI.ext.inpainting + :members: + :undoc-members: + :show-inheritance: + +pyFAI.ext.invert_geometry module +-------------------------------- + +.. automodule:: pyFAI.ext.invert_geometry + :members: + :undoc-members: + :show-inheritance: + +pyFAI.ext.morphology module +--------------------------- + +.. automodule:: pyFAI.ext.morphology + :members: + :undoc-members: + :show-inheritance: + +pyFAI.ext.preproc module +------------------------ + +.. automodule:: pyFAI.ext.preproc + :members: + :undoc-members: + :show-inheritance: + +pyFAI.ext.reconstruct module +---------------------------- + +.. automodule:: pyFAI.ext.reconstruct + :members: + :undoc-members: + :show-inheritance: + +pyFAI.ext.relabel module +------------------------ + +.. automodule:: pyFAI.ext.relabel + :members: + :undoc-members: + :show-inheritance: + +pyFAI.ext.setup module +---------------------- + +.. automodule:: pyFAI.ext.setup + :members: + :undoc-members: + :show-inheritance: + +pyFAI.ext.sparse_builder module +------------------------------- + +.. automodule:: pyFAI.ext.sparse_builder + :members: + :undoc-members: + :show-inheritance: + +pyFAI.ext.sparse_utils module +----------------------------- + +.. automodule:: pyFAI.ext.sparse_utils + :members: + :undoc-members: + :show-inheritance: + +pyFAI.ext.splitBBox module +-------------------------- + +.. automodule:: pyFAI.ext.splitBBox + :members: + :undoc-members: + :show-inheritance: + +pyFAI.ext.splitBBoxCSR module +----------------------------- + +.. automodule:: pyFAI.ext.splitBBoxCSR + :members: + :undoc-members: + :show-inheritance: + +pyFAI.ext.splitBBoxLUT module +----------------------------- + +.. automodule:: pyFAI.ext.splitBBoxLUT + :members: + :undoc-members: + :show-inheritance: + +pyFAI.ext.splitPixel module +--------------------------- + +.. automodule:: pyFAI.ext.splitPixel + :members: + :undoc-members: + :show-inheritance: + +pyFAI.ext.splitPixelFull module +------------------------------- + +.. automodule:: pyFAI.ext.splitPixelFull + :members: + :undoc-members: + :show-inheritance: + +pyFAI.ext.splitPixelFullCSR module +---------------------------------- + +.. automodule:: pyFAI.ext.splitPixelFullCSR + :members: + :undoc-members: + :show-inheritance: + +pyFAI.ext.splitPixelFullLUT module +---------------------------------- + +.. automodule:: pyFAI.ext.splitPixelFullLUT + :members: + :undoc-members: + :show-inheritance: + +pyFAI.ext.watershed module +-------------------------- + +.. automodule:: pyFAI.ext.watershed + :members: + :undoc-members: + :show-inheritance: + +Module contents +--------------- + +.. automodule:: pyFAI.ext + :members: + :undoc-members: + :show-inheritance: + +pyFAI.ext private package +========================= + +:mod:`ext._bispev` Module +------------------------- + +.. automodule:: pyFAI.ext._bispev + :members: + :undoc-members: + :show-inheritance: + +:mod:`ext._blob` Module +----------------------- + +.. automodule:: pyFAI.ext._blob + :members: + :undoc-members: + :show-inheritance: + +:mod:`ext._convolution` Module +------------------------------ + +.. automodule:: pyFAI.ext._convolution + :members: + :undoc-members: + :show-inheritance: + +:mod:`ext._distortion` Module +----------------------------- + +.. automodule:: pyFAI.ext._distortion + :members: + :undoc-members: + :show-inheritance: + +:mod:`ext._geometry` Module +--------------------------- + +.. automodule:: pyFAI.ext._geometry + :members: + :undoc-members: + :show-inheritance: + +:mod:`ext._tree` Module +----------------------- + +.. automodule:: pyFAI.ext._tree + :members: + :undoc-members: + :show-inheritance: diff --git a/doc/source/api/gui/dialog.rst b/doc/source/api/gui/dialog.rst new file mode 100644 index 00000000..fe885b9d --- /dev/null +++ b/doc/source/api/gui/dialog.rst @@ -0,0 +1,62 @@ +pyFAI.gui.dialog package +======================== + +Submodules +---------- + +pyFAI.gui.dialog.Detector3dDialog module +---------------------------------------- + +.. automodule:: pyFAI.gui.dialog.Detector3dDialog + :members: + :undoc-members: + :show-inheritance: + +pyFAI.gui.dialog.DetectorSelectorDialog module +---------------------------------------------- + +.. automodule:: pyFAI.gui.dialog.DetectorSelectorDialog + :members: + :undoc-members: + :show-inheritance: + +pyFAI.gui.dialog.GeometryDialog module +-------------------------------------- + +.. automodule:: pyFAI.gui.dialog.GeometryDialog + :members: + :undoc-members: + :show-inheritance: + +pyFAI.gui.dialog.IntegrationMethodDialog module +----------------------------------------------- + +.. automodule:: pyFAI.gui.dialog.IntegrationMethodDialog + :members: + :undoc-members: + :show-inheritance: + +pyFAI.gui.dialog.MessageBox module +---------------------------------- + +.. automodule:: pyFAI.gui.dialog.MessageBox + :members: + :undoc-members: + :show-inheritance: + +pyFAI.gui.dialog.OpenClDeviceDialog module +------------------------------------------ + +.. automodule:: pyFAI.gui.dialog.OpenClDeviceDialog + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: pyFAI.gui.dialog + :members: + :undoc-members: + :show-inheritance: diff --git a/doc/source/api/gui/helper.rst b/doc/source/api/gui/helper.rst new file mode 100644 index 00000000..d25c27ff --- /dev/null +++ b/doc/source/api/gui/helper.rst @@ -0,0 +1,78 @@ +pyFAI.gui.helper package +======================== + +Submodules +---------- + +pyFAI.gui.helper.MarkerManager module +------------------------------------- + +.. automodule:: pyFAI.gui.helper.MarkerManager + :members: + :undoc-members: + :show-inheritance: + +pyFAI.gui.helper.ProcessingWidget module +---------------------------------------- + +.. automodule:: pyFAI.gui.helper.ProcessingWidget + :members: + :undoc-members: + :show-inheritance: + +pyFAI.gui.helper.RingCalibration module +--------------------------------------- + +.. automodule:: pyFAI.gui.helper.RingCalibration + :members: + :undoc-members: + :show-inheritance: + +pyFAI.gui.helper.RingExtractor module +------------------------------------- + +.. automodule:: pyFAI.gui.helper.RingExtractor + :members: + :undoc-members: + :show-inheritance: + +pyFAI.gui.helper.SynchronizeMaskToolColor module +------------------------------------------------ + +.. automodule:: pyFAI.gui.helper.SynchronizeMaskToolColor + :members: + :undoc-members: + :show-inheritance: + +pyFAI.gui.helper.SynchronizePlotBackground module +------------------------------------------------- + +.. automodule:: pyFAI.gui.helper.SynchronizePlotBackground + :members: + :undoc-members: + :show-inheritance: + +pyFAI.gui.helper.SynchronizeRawView module +------------------------------------------ + +.. automodule:: pyFAI.gui.helper.SynchronizeRawView + :members: + :undoc-members: + :show-inheritance: + +pyFAI.gui.helper.model_transform module +--------------------------------------- + +.. automodule:: pyFAI.gui.helper.model_transform + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: pyFAI.gui.helper + :members: + :undoc-members: + :show-inheritance: diff --git a/doc/source/api/gui/index.rst b/doc/source/api/gui/index.rst new file mode 100644 index 00000000..e17f8a70 --- /dev/null +++ b/doc/source/api/gui/index.rst @@ -0,0 +1,106 @@ +pyFAI.gui package +================= + +Subpackages +----------- + +.. toctree:: + + dialog + helper + model + tasks + utils + widgets + +Submodules +---------- + +pyFAI.gui.ApplicationContext module +----------------------------------- + +.. automodule:: pyFAI.gui.ApplicationContext + :members: + :undoc-members: + :show-inheritance: + +pyFAI.gui.CalibrationContext module +----------------------------------- + +.. automodule:: pyFAI.gui.CalibrationContext + :members: + :undoc-members: + :show-inheritance: + +pyFAI.gui.CalibrationWindow module +---------------------------------- + +.. automodule:: pyFAI.gui.CalibrationWindow + :members: + :undoc-members: + :show-inheritance: + +pyFAI.gui.IntegrationDialog module +---------------------------------- + +.. automodule:: pyFAI.gui.IntegrationDialog + :members: + :undoc-members: + :show-inheritance: + +pyFAI.gui.cli_calibration module +-------------------------------- + +.. automodule:: pyFAI.gui.cli_calibration + :members: + :undoc-members: + :show-inheritance: + +pyFAI.gui.diffmap_widget module +------------------------------- + +.. automodule:: pyFAI.gui.diffmap_widget + :members: + :undoc-members: + :show-inheritance: + +pyFAI.gui.jupyter module +------------------------ + +.. automodule:: pyFAI.gui.jupyter + :members: + :undoc-members: + :show-inheritance: + +pyFAI.gui.matplotlib module +--------------------------- + +.. automodule:: pyFAI.gui.matplotlib + :members: + :undoc-members: + :show-inheritance: + +pyFAI.gui.peak_picker module +---------------------------- + +.. automodule:: pyFAI.gui.peak_picker + :members: + :undoc-members: + :show-inheritance: + +pyFAI.gui.setup module +---------------------- + +.. automodule:: pyFAI.gui.setup + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: pyFAI.gui + :members: + :undoc-members: + :show-inheritance: diff --git a/doc/source/api/gui/model.rst b/doc/source/api/gui/model.rst new file mode 100644 index 00000000..dc61a455 --- /dev/null +++ b/doc/source/api/gui/model.rst @@ -0,0 +1,182 @@ +pyFAI.gui.model package +======================= + +Submodules +---------- + +pyFAI.gui.model.AbstractModel module +------------------------------------ + +.. automodule:: pyFAI.gui.model.AbstractModel + :members: + :undoc-members: + :show-inheritance: + +pyFAI.gui.model.CalibrantModel module +------------------------------------- + +.. automodule:: pyFAI.gui.model.CalibrantModel + :members: + :undoc-members: + :show-inheritance: + +pyFAI.gui.model.CalibrationModel module +--------------------------------------- + +.. automodule:: pyFAI.gui.model.CalibrationModel + :members: + :undoc-members: + :show-inheritance: + +pyFAI.gui.model.ConstraintModel module +-------------------------------------- + +.. automodule:: pyFAI.gui.model.ConstraintModel + :members: + :undoc-members: + :show-inheritance: + +pyFAI.gui.model.DataModel module +-------------------------------- + +.. automodule:: pyFAI.gui.model.DataModel + :members: + :undoc-members: + :show-inheritance: + +pyFAI.gui.model.DataModelAdaptor module +--------------------------------------- + +.. automodule:: pyFAI.gui.model.DataModelAdaptor + :members: + :undoc-members: + :show-inheritance: + +pyFAI.gui.model.DetectorModel module +------------------------------------ + +.. automodule:: pyFAI.gui.model.DetectorModel + :members: + :undoc-members: + :show-inheritance: + +pyFAI.gui.model.ExperimentSettingsModel module +---------------------------------------------- + +.. automodule:: pyFAI.gui.model.ExperimentSettingsModel + :members: + :undoc-members: + :show-inheritance: + +pyFAI.gui.model.FilenameModel module +------------------------------------ + +.. automodule:: pyFAI.gui.model.FilenameModel + :members: + :undoc-members: + :show-inheritance: + +pyFAI.gui.model.Fit2dGeometryModel module +----------------------------------------- + +.. automodule:: pyFAI.gui.model.Fit2dGeometryModel + :members: + :undoc-members: + :show-inheritance: + +pyFAI.gui.model.GeometryConstraintsModel module +----------------------------------------------- + +.. automodule:: pyFAI.gui.model.GeometryConstraintsModel + :members: + :undoc-members: + :show-inheritance: + +pyFAI.gui.model.GeometryHistoryModel module +------------------------------------------- + +.. automodule:: pyFAI.gui.model.GeometryHistoryModel + :members: + :undoc-members: + :show-inheritance: + +pyFAI.gui.model.GeometryModel module +------------------------------------ + +.. automodule:: pyFAI.gui.model.GeometryModel + :members: + :undoc-members: + :show-inheritance: + +pyFAI.gui.model.ImageModel module +--------------------------------- + +.. automodule:: pyFAI.gui.model.ImageModel + :members: + :undoc-members: + :show-inheritance: + +pyFAI.gui.model.IntegrationSettingsModel module +----------------------------------------------- + +.. automodule:: pyFAI.gui.model.IntegrationSettingsModel + :members: + :undoc-members: + :show-inheritance: + +pyFAI.gui.model.ListModel module +-------------------------------- + +.. automodule:: pyFAI.gui.model.ListModel + :members: + :undoc-members: + :show-inheritance: + +pyFAI.gui.model.MarkerModel module +---------------------------------- + +.. automodule:: pyFAI.gui.model.MarkerModel + :members: + :undoc-members: + :show-inheritance: + +pyFAI.gui.model.MaskedImageModel module +--------------------------------------- + +.. automodule:: pyFAI.gui.model.MaskedImageModel + :members: + :undoc-members: + :show-inheritance: + +pyFAI.gui.model.PeakModel module +-------------------------------- + +.. automodule:: pyFAI.gui.model.PeakModel + :members: + :undoc-members: + :show-inheritance: + +pyFAI.gui.model.PeakSelectionModel module +----------------------------------------- + +.. automodule:: pyFAI.gui.model.PeakSelectionModel + :members: + :undoc-members: + :show-inheritance: + +pyFAI.gui.model.PlotViewModel module +------------------------------------ + +.. automodule:: pyFAI.gui.model.PlotViewModel + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: pyFAI.gui.model + :members: + :undoc-members: + :show-inheritance: diff --git a/doc/source/api/gui/tasks.rst b/doc/source/api/gui/tasks.rst new file mode 100644 index 00000000..af5c183a --- /dev/null +++ b/doc/source/api/gui/tasks.rst @@ -0,0 +1,62 @@ +pyFAI.gui.tasks package +======================= + +Submodules +---------- + +pyFAI.gui.tasks.AbstractCalibrationTask module +---------------------------------------------- + +.. automodule:: pyFAI.gui.tasks.AbstractCalibrationTask + :members: + :undoc-members: + :show-inheritance: + +pyFAI.gui.tasks.ExperimentTask module +------------------------------------- + +.. automodule:: pyFAI.gui.tasks.ExperimentTask + :members: + :undoc-members: + :show-inheritance: + +pyFAI.gui.tasks.GeometryTask module +----------------------------------- + +.. automodule:: pyFAI.gui.tasks.GeometryTask + :members: + :undoc-members: + :show-inheritance: + +pyFAI.gui.tasks.IntegrationTask module +-------------------------------------- + +.. automodule:: pyFAI.gui.tasks.IntegrationTask + :members: + :undoc-members: + :show-inheritance: + +pyFAI.gui.tasks.MaskTask module +------------------------------- + +.. automodule:: pyFAI.gui.tasks.MaskTask + :members: + :undoc-members: + :show-inheritance: + +pyFAI.gui.tasks.PeakPickingTask module +-------------------------------------- + +.. automodule:: pyFAI.gui.tasks.PeakPickingTask + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: pyFAI.gui.tasks + :members: + :undoc-members: + :show-inheritance: diff --git a/doc/source/api/gui/utils.rst b/doc/source/api/gui/utils.rst new file mode 100644 index 00000000..d33ce942 --- /dev/null +++ b/doc/source/api/gui/utils.rst @@ -0,0 +1,107 @@ +pyFAI.gui.utils package +======================= + +pyFAI.gui.utils.FilterBuilder module +------------------------------------ + +.. automodule:: pyFAI.gui.utils.FilterBuilder + :members: + :undoc-members: + :show-inheritance: + +pyFAI.gui.utils.ProxyAction module +---------------------------------- + +.. automodule:: pyFAI.gui.utils.ProxyAction + :members: + :undoc-members: + :show-inheritance: + +pyFAI.gui.utils.colorutils module +--------------------------------- + +.. automodule:: pyFAI.gui.utils.colorutils + :members: + :undoc-members: + :show-inheritance: + +pyFAI.gui.utils.eventutils module +--------------------------------- + +.. automodule:: pyFAI.gui.utils.eventutils + :members: + :undoc-members: + :show-inheritance: + +pyFAI.gui.utils.imageutils module +--------------------------------- + +.. automodule:: pyFAI.gui.utils.imageutils + :members: + :undoc-members: + :show-inheritance: + +pyFAI.gui.utils.projecturl module +--------------------------------- + +.. automodule:: pyFAI.gui.utils.projecturl + :members: + :undoc-members: + :show-inheritance: + +pyFAI.gui.utils.setup module +---------------------------- + +.. automodule:: pyFAI.gui.utils.setup + :members: + :undoc-members: + :show-inheritance: + +pyFAI.gui.utils.timeutils module +-------------------------------- + +.. automodule:: pyFAI.gui.utils.timeutils + :members: + :undoc-members: + :show-inheritance: + +pyFAI.gui.utils.tree module +--------------------------- + +.. automodule:: pyFAI.gui.utils.tree + :members: + :undoc-members: + :show-inheritance: + +pyFAI.gui.utils.units module +---------------------------- + +.. automodule:: pyFAI.gui.utils.units + :members: + :undoc-members: + :show-inheritance: + +pyFAI.gui.utils.unitutils module +-------------------------------- + +.. automodule:: pyFAI.gui.utils.unitutils + :members: + :undoc-members: + :show-inheritance: + +pyFAI.gui.utils.validators module +--------------------------------- + +.. automodule:: pyFAI.gui.utils.validators + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: pyFAI.gui.utils + :members: + :undoc-members: + :show-inheritance: diff --git a/doc/source/api/gui/widgets.rst b/doc/source/api/gui/widgets.rst new file mode 100644 index 00000000..6b813913 --- /dev/null +++ b/doc/source/api/gui/widgets.rst @@ -0,0 +1,198 @@ +pyFAI.gui.widgets package +========================= + +Submodules +---------- + +pyFAI.gui.widgets.AdvancedComboBox module +----------------------------------------- + +.. automodule:: pyFAI.gui.widgets.AdvancedComboBox + :members: + :undoc-members: + :show-inheritance: + +pyFAI.gui.widgets.AdvancedSpinBox module +---------------------------------------- + +.. automodule:: pyFAI.gui.widgets.AdvancedSpinBox + :members: + :undoc-members: + :show-inheritance: + +pyFAI.gui.widgets.CalibrantPreview module +----------------------------------------- + +.. automodule:: pyFAI.gui.widgets.CalibrantPreview + :members: + :undoc-members: + :show-inheritance: + +pyFAI.gui.widgets.CalibrantSelector module +------------------------------------------ + +.. automodule:: pyFAI.gui.widgets.CalibrantSelector + :members: + :undoc-members: + :show-inheritance: + +pyFAI.gui.widgets.ChoiceToolButton module +----------------------------------------- + +.. automodule:: pyFAI.gui.widgets.ChoiceToolButton + :members: + :undoc-members: + :show-inheritance: + +pyFAI.gui.widgets.ColoredCheckBox module +---------------------------------------- + +.. automodule:: pyFAI.gui.widgets.ColoredCheckBox + :members: + :undoc-members: + :show-inheritance: + +pyFAI.gui.widgets.DetectorLabel module +-------------------------------------- + +.. automodule:: pyFAI.gui.widgets.DetectorLabel + :members: + :undoc-members: + :show-inheritance: + +pyFAI.gui.widgets.DetectorModel module +-------------------------------------- + +.. automodule:: pyFAI.gui.widgets.DetectorModel + :members: + :undoc-members: + :show-inheritance: + +pyFAI.gui.widgets.DetectorSelector module +----------------------------------------- + +.. automodule:: pyFAI.gui.widgets.DetectorSelector + :members: + :undoc-members: + :show-inheritance: + +pyFAI.gui.widgets.ElidedLabel module +------------------------------------ + +.. automodule:: pyFAI.gui.widgets.ElidedLabel + :members: + :undoc-members: + :show-inheritance: + +pyFAI.gui.widgets.FileEdit module +--------------------------------- + +.. automodule:: pyFAI.gui.widgets.FileEdit + :members: + :undoc-members: + :show-inheritance: + +pyFAI.gui.widgets.FitParamView module +------------------------------------- + +.. automodule:: pyFAI.gui.widgets.FitParamView + :members: + :undoc-members: + :show-inheritance: + +pyFAI.gui.widgets.GeometryHistoryComboBox module +------------------------------------------------ + +.. automodule:: pyFAI.gui.widgets.GeometryHistoryComboBox + :members: + :undoc-members: + :show-inheritance: + +pyFAI.gui.widgets.GeometryLabel module +-------------------------------------- + +.. automodule:: pyFAI.gui.widgets.GeometryLabel + :members: + :undoc-members: + :show-inheritance: + +pyFAI.gui.widgets.LoadImageToolButton module +-------------------------------------------- + +.. automodule:: pyFAI.gui.widgets.LoadImageToolButton + :members: + :undoc-members: + :show-inheritance: + +pyFAI.gui.widgets.MethodLabel module +------------------------------------ + +.. automodule:: pyFAI.gui.widgets.MethodLabel + :members: + :undoc-members: + :show-inheritance: + +pyFAI.gui.widgets.MonitorNameEdit module +---------------------------------------- + +.. automodule:: pyFAI.gui.widgets.MonitorNameEdit + :members: + :undoc-members: + :show-inheritance: + +pyFAI.gui.widgets.OpenClDeviceLabel module +------------------------------------------ + +.. automodule:: pyFAI.gui.widgets.OpenClDeviceLabel + :members: + :undoc-members: + :show-inheritance: + +pyFAI.gui.widgets.QuantityEdit module +------------------------------------- + +.. automodule:: pyFAI.gui.widgets.QuantityEdit + :members: + :undoc-members: + :show-inheritance: + +pyFAI.gui.widgets.QuantityLabel module +-------------------------------------- + +.. automodule:: pyFAI.gui.widgets.QuantityLabel + :members: + :undoc-members: + :show-inheritance: + +pyFAI.gui.widgets.UnitLabel module +---------------------------------- + +.. automodule:: pyFAI.gui.widgets.UnitLabel + :members: + :undoc-members: + :show-inheritance: + +pyFAI.gui.widgets.UnitSelector module +------------------------------------- + +.. automodule:: pyFAI.gui.widgets.UnitSelector + :members: + :undoc-members: + :show-inheritance: + +pyFAI.gui.widgets.WorkerConfigurator module +------------------------------------------- + +.. automodule:: pyFAI.gui.widgets.WorkerConfigurator + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: pyFAI.gui.widgets + :members: + :undoc-members: + :show-inheritance: diff --git a/doc/source/api/io/index.rst b/doc/source/api/io/index.rst new file mode 100644 index 00000000..2b90f9ef --- /dev/null +++ b/doc/source/api/io/index.rst @@ -0,0 +1,38 @@ +pyFAI.io package +================ + +Submodules +---------- + +pyFAI.io.image module +--------------------- + +.. automodule:: pyFAI.io.image + :members: + :undoc-members: + :show-inheritance: + +pyFAI.io.integration_config module +---------------------------------- + +.. automodule:: pyFAI.io.integration_config + :members: + :undoc-members: + :show-inheritance: + +pyFAI.io.ponifile module +------------------------ + +.. automodule:: pyFAI.io.ponifile + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: pyFAI.io + :members: + :undoc-members: + :show-inheritance: diff --git a/doc/source/api/opencl/index.rst b/doc/source/api/opencl/index.rst new file mode 100644 index 00000000..eb3a2ea4 --- /dev/null +++ b/doc/source/api/opencl/index.rst @@ -0,0 +1,75 @@ +pyFAI.opencl package +==================== + +pyFAI.opencl.OCLFullSplit module +-------------------------------- + +.. automodule:: pyFAI.opencl.OCLFullSplit + :members: + :undoc-members: + :show-inheritance: + +pyFAI.opencl.azim_csr module +---------------------------- + +.. automodule:: pyFAI.opencl.azim_csr + :members: + :undoc-members: + :show-inheritance: + +pyFAI.opencl.azim_hist module +----------------------------- + +.. automodule:: pyFAI.opencl.azim_hist + :members: + :undoc-members: + :show-inheritance: + +pyFAI.opencl.azim_lut module +---------------------------- + +.. automodule:: pyFAI.opencl.azim_lut + :members: + :undoc-members: + :show-inheritance: + +pyFAI.opencl.ocl_hist_pixelsplit module +--------------------------------------- + +.. automodule:: pyFAI.opencl.ocl_hist_pixelsplit + :members: + :undoc-members: + :show-inheritance: + +pyFAI.opencl.preproc module +--------------------------- + +.. automodule:: pyFAI.opencl.preproc + :members: + :undoc-members: + :show-inheritance: + +pyFAI.opencl.setup module +------------------------- + +.. automodule:: pyFAI.opencl.setup + :members: + :undoc-members: + :show-inheritance: + +pyFAI.opencl.sort module +------------------------ + +.. automodule:: pyFAI.opencl.sort + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: pyFAI.opencl + :members: + :undoc-members: + :show-inheritance: diff --git a/doc/source/api/pyFAI.rst b/doc/source/api/pyFAI.rst index 531d8e3d..196e62b6 100644 --- a/doc/source/api/pyFAI.rst +++ b/doc/source/api/pyFAI.rst @@ -1,3 +1,20 @@ +pyFAI package +============= + +Subpackages +----------- + +.. toctree:: + + app/index + detectors/index + engines/index + ext/index + gui/index + io/index + opencl/index + resources/index + utils/index :mod:`pyFAI` Package -------------------- @@ -31,15 +48,6 @@ :undoc-members: :show-inheritance: - -:mod:`integrate_widget` Module ------------------------------- - -.. automodule:: pyFAI.integrate_widget - :members: - :undoc-members: - :show-inheritance: - :mod:`geometry` Module ---------------------- @@ -64,16 +72,6 @@ :undoc-members: :show-inheritance: - - -:mod:`detectors` Module ------------------------ - -.. automodule:: pyFAI.detectors - :members: - :undoc-members: - :show-inheritance: - :mod:`spline` Module -------------------- @@ -82,22 +80,6 @@ :undoc-members: :show-inheritance: -:mod:`io` Module ----------------- - -.. automodule:: pyFAI.io - :members: - :undoc-members: - :show-inheritance: - -:mod:`calibration` Module -------------------------- - -.. automodule:: pyFAI.calibration - :members: - :undoc-members: - :show-inheritance: - :mod:`control_points` Module ---------------------------- @@ -106,15 +88,6 @@ :undoc-members: :show-inheritance: - -:mod:`peak_picker` Module -------------------------- - -.. automodule:: pyFAI.peak_picker - :members: - :undoc-members: - :show-inheritance: - :mod:`massif` Module -------------------- @@ -155,307 +128,3 @@ :members: :undoc-members: :show-inheritance: - -:mod:`units` Module -------------------- - -.. automodule:: pyFAI.units - :members: - :undoc-members: - :show-inheritance: - -:mod:`utils.__init__` Module ----------------------------- - -Sub module with miscelaneous tools - -.. automodule:: pyFAI.utils.__init__ - :members: - :undoc-members: - :show-inheritance: - -:mod:`utils.bayes` Module -......................... - -Tool for bayesian filtering-out of positive peaks - -.. automodule:: pyFAI.utils.bayes - :members: - :undoc-members: - :show-inheritance: - -:mod:`utils.shell` Module -......................... - -Contains the progress-bar in the shell command line - -.. automodule:: pyFAI.utils.shell - :members: - :undoc-members: - :show-inheritance: - -:mod:`utils.stringutil` Module -.............................. - -Enhanced string formatter - -.. automodule:: pyFAI.utils.stringutil - :members: - :undoc-members: - :show-inheritance: - - -:mod:`opencl.__init__` Module ------------------------------ - -Contains all OpenCL implementation. - -.. automodule:: pyFAI.opencl - :members: - :undoc-members: - :show-inheritance: - -:mod:`opencl.common` Module -........................... - -.. automodule:: pyFAI.opencl.common - :members: - :undoc-members: - :show-inheritance: - -:mod:`opencl.processing` Module -............................... - -.. automodule:: pyFAI.opencl.processing - :members: - :undoc-members: - :show-inheritance: - - -:mod:`opencl.preproc` Module -............................ - -.. automodule:: pyFAI.opencl.preproc - :members: - :undoc-members: - :show-inheritance: - - -:mod:`opencl.azim_hist` Module -.............................. - -.. automodule:: pyFAI.opencl.azim_hist - :members: - :undoc-members: - :show-inheritance: - -:mod:`opencl.azim_lut` Module -............................. - -.. automodule:: pyFAI.opencl.azim_lut - :members: - :undoc-members: - :show-inheritance: - -:mod:`opencl.azim_csr` Module -............................. - -.. automodule:: pyFAI.opencl.azim_csr - :members: - :undoc-members: - :show-inheritance: - - -:mod:`gui.__init__` Module --------------------------- - -.. automodule:: pyFAI.gui.__init__ - :members: - :undoc-members: - :show-inheritance: - -:mod:`gui.matplotlib` Module -............................ - -Initialize properly Matplotlib - -.. automodule:: pyFAI.gui.matplotlib - :members: - :undoc-members: - :show-inheritance: - -:mod:`gui.qt` Module -.................... - - -.. automodule:: pyFAI.gui.qt - :members: - :undoc-members: - :show-inheritance: - - -:mod:`gui.utils` Module -....................... - -.. automodule:: pyFAI.gui.utils - :members: - :undoc-members: - :show-inheritance: - -:mod:`ext.__init__` Module --------------------------- -Sub-module with all Cython binary extensions - -.. automodule:: pyFAI.ext.__init__ - :members: - :undoc-members: - :show-inheritance: - - -:mod:`ext.bilinear` Module -.......................... - -This extension makes a discrete 2D-array appear like a continuous function thanks -to bilinear interpolations. - -.. automodule:: pyFAI.ext.bilinear - :members: - :undoc-members: - :show-inheritance: - -:mod:`ext._bispev` Module -......................... - -This extension is a re-implementation of bi-cubic spline evaluation from scipy - -.. automodule:: pyFAI.ext._bispev - :members: - :undoc-members: - :show-inheritance: - -:mod:`ext._blob` Module -....................... - -Blob detection is used to find peaks in images by performing subsequent blurs - -.. automodule:: pyFAI.ext._blob - :members: - :undoc-members: - :show-inheritance: - -:mod:`ext._convolution` Module -.............................. - -Convolutions in real space are used to blurs images, used in blob-detection algorithm - -.. automodule:: pyFAI.ext._convolution - :members: - :undoc-members: - :show-inheritance: - -:mod:`ext._distortion` Module -............................. - -Distortion correction are correction are applied by Look-up table (or CSR) - -.. automodule:: pyFAI.ext._distortion - :members: - :undoc-members: - :show-inheritance: - -:mod:`ext._geometry` Module -........................... - -This extension is a fast-implementation for calculating the geometry, i.e. where -every pixel of an array stays in space (x,y,z) or its (r, \chi) coordinates. - -.. automodule:: pyFAI.ext._geometry - :members: - :undoc-members: - :show-inheritance: - -:mod:`ext.histogram` Module -........................... - -Re-implementation of the numpy.histogram, optimized for azimuthal integration. -Deprecated, will be replaced by silx.math.histogramnd - -.. automodule:: pyFAI.ext.histogram - :members: - :undoc-members: - :show-inheritance: - -:mod:`ext.invert_geometry` Module -................................. - -Allow the inversion of pixel coordinate --> radius/azimuthal -with linear interpolation within the last pixel - -.. automodule:: pyFAI.ext.invert_geometry - :members: - :undoc-members: - :show-inheritance: - - -:mod:`ext.morphology` Module -............................ - -The morphology extension provides a couple of binary morphology operations on images. -They are also implemented in scipy.ndimage in the general case, but not as fast. - -.. automodule:: pyFAI.ext.morphology - :members: - :undoc-members: - :show-inheritance: - -:mod:`ext.reconstruct` Module -............................. - -Very simple inpainting module for reconstructing the missing part of an image (masked) -to be able to use more common algorithms. - -.. automodule:: pyFAI.ext.reconstruct - :members: - :undoc-members: - :show-inheritance: - -:mod:`ext.relabel` Module -......................... - -Relabel regions, used to flag from largest regions to the smallest - -.. automodule:: pyFAI.ext.relabel - :members: - :undoc-members: - :show-inheritance: - -:mod:`ext.preproc` Module -......................... - -Contains a preprocessing function in charge of the dark-current subtraction, -flat-field normalization, ... taking care of masked values and normalization. - -.. automodule:: pyFAI.ext.preproc - :members: - :undoc-members: - :show-inheritance: - -:mod:`ext._tree` Module -....................... - -The tree is used in file hierarchy tree for the diff_map graphical user interface. - -.. automodule:: pyFAI.ext._tree - :members: - :undoc-members: - :show-inheritance: - -:mod:`ext.watershed` Module -........................... - -Peak peaking via inverse watershed for connecting region of high intensity - -.. automodule:: pyFAI.ext.watershed - :members: - :undoc-members: - :show-inheritance: diff --git a/doc/source/api/resources/index.rst b/doc/source/api/resources/index.rst new file mode 100644 index 00000000..415e96d3 --- /dev/null +++ b/doc/source/api/resources/index.rst @@ -0,0 +1,22 @@ +pyFAI.resources package +======================= + +Submodules +---------- + +pyFAI.resources.setup module +---------------------------- + +.. automodule:: pyFAI.resources.setup + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: pyFAI.resources + :members: + :undoc-members: + :show-inheritance: diff --git a/doc/source/api/utils/index.rst b/doc/source/api/utils/index.rst new file mode 100644 index 00000000..a0359105 --- /dev/null +++ b/doc/source/api/utils/index.rst @@ -0,0 +1,91 @@ +pyFAI.utils package +=================== + +pyFAI.utils.bayes module +------------------------ + +.. automodule:: pyFAI.utils.bayes + :members: + :undoc-members: + :show-inheritance: + +pyFAI.utils.decorators module +----------------------------- + +.. automodule:: pyFAI.utils.decorators + :members: + :undoc-members: + :show-inheritance: + +pyFAI.utils.ellipse module +-------------------------- + +.. automodule:: pyFAI.utils.ellipse + :members: + :undoc-members: + :show-inheritance: + +pyFAI.utils.header_utils module +------------------------------- + +.. automodule:: pyFAI.utils.header_utils + :members: + :undoc-members: + :show-inheritance: + +pyFAI.utils.logging_utils module +-------------------------------- + +.. automodule:: pyFAI.utils.logging_utils + :members: + :undoc-members: + :show-inheritance: + +pyFAI.utils.mathutil module +--------------------------- + +.. automodule:: pyFAI.utils.mathutil + :members: + :undoc-members: + :show-inheritance: + +pyFAI.utils.orderedset module +----------------------------- + +.. automodule:: pyFAI.utils.orderedset + :members: + :undoc-members: + :show-inheritance: + +pyFAI.utils.setup module +------------------------ + +.. automodule:: pyFAI.utils.setup + :members: + :undoc-members: + :show-inheritance: + +pyFAI.utils.shell module +------------------------ + +.. automodule:: pyFAI.utils.shell + :members: + :undoc-members: + :show-inheritance: + +pyFAI.utils.stringutil module +----------------------------- + +.. automodule:: pyFAI.utils.stringutil + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: pyFAI.utils + :members: + :undoc-members: + :show-inheritance: From f9086ea9394c873c1ab18049b4ab69f1c26ccbc9 Mon Sep 17 00:00:00 2001 From: Valentin Valls Date: Fri, 17 May 2019 11:29:59 +0200 Subject: [PATCH 4/9] Typo --- doc/source/man/scripts.rst | 22 +++++++++++----------- doc/source/pyFAI.rst | 4 ++-- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/doc/source/man/scripts.rst b/doc/source/man/scripts.rst index 2dac13de..45cb6773 100644 --- a/doc/source/man/scripts.rst +++ b/doc/source/man/scripts.rst @@ -15,21 +15,21 @@ The calibration is the determination of the geometry of the experimental setup u Finally a full dataset can be integrated using different tools targeted at different experiments. Pre-processing tools: - * pyFAI-drawmask: tool for drawing a mask on top of an image - * pyFAI-average: tool for averaging/median/... filtering images (i.e. for dark current) + * ``pyFAI-drawmask``: tool for drawing a mask on top of an image (deprecated) + * ``pyFAI-average``: tool for averaging/median/... filtering images (i.e. for dark current) Calibration tools: - * pyFAI-calib: manually select the rings and refine the geometry - * pyFAI-recalib: automatic ring extraction to refine the geometry (deprecated: see "recalib" option in pyFAI-calib) - * MX-calibrate: Calibrate automatically a set of images taken at various detector distances - * check_calib: checks the calibration of an image at the sub-pixel level (deprecated: see "validate" option in pyFAI-calib) + * ``pyFAI-calib2`` and ``pyFAI-calib``: manually select the rings and refine the geometry + * ``pyFAI-recalib``: automatic ring extraction to refine the geometry (deprecated: see "recalib" option in pyFAI-calib) + * ``MX-calibrate``: Calibrate automatically a set of images taken at various detector distances + * ``check_calib``: checks the calibration of an image at the sub-pixel level (deprecated: see "validate" option in pyFAI-calib) Azimuthal integration tools: - * pyFAI-integrate: the graphical interface for integration (GUI) - * pyFAI-saxs: command line interface for small-angle scattering - * pyFAI-waxs: command line interface for powder difration - * diff_map: diffraction mapping & tomography tool (command line and GUI) - * diff_tomo: diffraction tomography tool (command line only) + * ``pyFAI-integrate``: the graphical interface for integration (GUI) + * ``pyFAI-saxs``: command line interface for small-angle scattering + * ``pyFAI-waxs``: command line interface for powder difration + * ``diff_map``: diffraction mapping & tomography tool (command line and GUI) + * ``diff_tomo``: diffraction tomography tool (command line only) .. toctree:: :maxdepth: 1 diff --git a/doc/source/pyFAI.rst b/doc/source/pyFAI.rst index 379983a8..a2a40261 100644 --- a/doc/source/pyFAI.rst +++ b/doc/source/pyFAI.rst @@ -61,10 +61,10 @@ implemente from scratch a novel azimuthal integration tool which is designed to take advantage of modern parallel hardware features. PyFAI assumes the setup does not change during the experiment and tries to reuse a maximum number of data (using memoization_), moreover those calculation are performed -only when needed (lazy_evaluation_). +only when needed (`lazy evaluation`_). .. _memoization: http://en.wikipedia.org/wiki/Memoization -.. _lazy_evaluation: http://en.wikipedia.org/wiki/Lazy_evaluation +.. _lazy evaluation: http://en.wikipedia.org/wiki/Lazy_evaluation Experiment description ---------------------- From c8186496245e73bf0a0975836c5586f4b83113e2 Mon Sep 17 00:00:00 2001 From: Valentin Valls Date: Fri, 17 May 2019 11:30:13 +0200 Subject: [PATCH 5/9] Remove bug relative to Debian 6 --- doc/source/man/pyFAI-integrate.rst | 3 --- 1 file changed, 3 deletions(-) diff --git a/doc/source/man/pyFAI-integrate.rst b/doc/source/man/pyFAI-integrate.rst index 378bea73..a09564e5 100644 --- a/doc/source/man/pyFAI-integrate.rst +++ b/doc/source/man/pyFAI-integrate.rst @@ -53,6 +53,3 @@ Tips & Tricks: PyFAI-integrate saves all parameters in a .azimint.json (hidden) file. This JSON file is an ascii file which can be edited and used to configure online data analysis using the LImA plugin of pyFAI. - -Nota: there is bug in debian6 making the GUI crash (to be fixed inside pyqt) -http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=697348 From 16edd33c5f1aefdce1888ae0cca756e48106f587 Mon Sep 17 00:00:00 2001 From: Valentin Valls Date: Fri, 17 May 2019 11:39:28 +0200 Subject: [PATCH 6/9] Avoid to gen big dict in the doc --- pyFAI/gui/cli_calibration.py | 74 ++++++++++++++++++------------------ 1 file changed, 37 insertions(+), 37 deletions(-) diff --git a/pyFAI/gui/cli_calibration.py b/pyFAI/gui/cli_calibration.py index 7502261f..99dc8f0e 100644 --- a/pyFAI/gui/cli_calibration.py +++ b/pyFAI/gui/cli_calibration.py @@ -37,7 +37,7 @@ __author__ = "Jerome Kieffer" __contact__ = "Jerome.Kieffer@ESRF.eu" __license__ = "MIT" __copyright__ = "European Synchrotron Radiation Facility, Grenoble, France" -__date__ = "17/12/2018" +__date__ = "17/05/2019" __status__ = "production" import os @@ -124,29 +124,29 @@ class AbstractCalibration(object): " display too many images without crashing, this"\ " is why the window showing the diffraction image"\ " is closed" - HELP = {"help": "Try to get the help of a given action, like 'refine?'. Use done when finished. " - "Most command are composed of 'action parameter value' like 'set wavelength 1 A'.", - "get": "print he value of a parameter", - "set": "set the value of a parameter to the given value, i.e 'set wavelength 0.1 nm', units are optional", - 'fix': "fixes the value of a parameter so that its value will not be optimized, i.e. 'fix wavelength'", - 'free': "frees the parameter so that the value can be optimized, i.e. 'free wavelength'", - 'bound': "sets the upper and lower bound of a parameter: 'bound dist 0.1 0.2'", - 'bounds': "sets the upper and lower bound of all parameters", - 'refine': "performs a new cycle of refinement", - 'recalib': "extract a new set of rings and re-perform the calibration. One can specify how many rings to extract and the algorithm to use (blob, massif, watershed) and the nb_pts_per_deg in azimuth", - 'done': "finishes the processing, performs an integration and quits", - 'validate': "plot the offset between the calibrated image and the back-projected image", - 'validate2': "measures the offset of the center as function of azimuthal angle by cross-correlation of 2 plots, 180 deg appart. Option: number of azimuthal sliced, default: 36", - 'integrate': "perform the azimuthal integration and display results", - 'abort': "quit immediately, discarding any unsaved changes", - 'show': "Just print out the current parameter set. Optional parameters are units for length, rotation and wavelength, i.e. 'show mm deg A'", - 'reset': "Reset the geometry to the initial guess (rotation to zero, distance to 0.1m, poni at the center of the image)", - 'assign': "Change the assignment of a group of points to a rings", - "weight": "toggle from weighted to unweighted mode...", - "define": "Re-define the value for a constant internal parameter of the program like max_iter, nPt_1D, nPt_2D_azim, nPt_2D_rad, integrator_method, error_model. Warning: attribute change may be harmful !", - "chiplot": "plot control point radial error as function of azimuthal angle, optional parameters: the rings for which this need to be plotted", - "delete": "delete a group of points, provide the letter." - } + _HELP = {"help": "Try to get the help of a given action, like 'refine?'. Use done when finished. " + "Most command are composed of 'action parameter value' like 'set wavelength 1 A'.", + "get": "print he value of a parameter", + "set": "set the value of a parameter to the given value, i.e 'set wavelength 0.1 nm', units are optional", + 'fix': "fixes the value of a parameter so that its value will not be optimized, i.e. 'fix wavelength'", + 'free': "frees the parameter so that the value can be optimized, i.e. 'free wavelength'", + 'bound': "sets the upper and lower bound of a parameter: 'bound dist 0.1 0.2'", + 'bounds': "sets the upper and lower bound of all parameters", + 'refine': "performs a new cycle of refinement", + 'recalib': "extract a new set of rings and re-perform the calibration. One can specify how many rings to extract and the algorithm to use (blob, massif, watershed) and the nb_pts_per_deg in azimuth", + 'done': "finishes the processing, performs an integration and quits", + 'validate': "plot the offset between the calibrated image and the back-projected image", + 'validate2': "measures the offset of the center as function of azimuthal angle by cross-correlation of 2 plots, 180 deg appart. Option: number of azimuthal sliced, default: 36", + 'integrate': "perform the azimuthal integration and display results", + 'abort': "quit immediately, discarding any unsaved changes", + 'show': "Just print out the current parameter set. Optional parameters are units for length, rotation and wavelength, i.e. 'show mm deg A'", + 'reset': "Reset the geometry to the initial guess (rotation to zero, distance to 0.1m, poni at the center of the image)", + 'assign': "Change the assignment of a group of points to a rings", + "weight": "toggle from weighted to unweighted mode...", + "define": "Re-define the value for a constant internal parameter of the program like max_iter, nPt_1D, nPt_2D_azim, nPt_2D_rad, integrator_method, error_model. Warning: attribute change may be harmful !", + "chiplot": "plot control point radial error as function of azimuthal angle, optional parameters: the rings for which this need to be plotted", + "delete": "delete a group of points, provide the letter." + } PARAMETERS = ["dist", "poni1", "poni2", "rot1", "rot2", "rot3", "wavelength"] UNITS = {"dist": "meter", "poni1": "meter", "poni2": "meter", "rot1": "radian", "rot2": "radian", "rot3": "radian", "wavelength": "meter"} @@ -795,15 +795,15 @@ class AbstractCalibration(object): if action in ["help", "?"]: req_help = True if req_help: - for what in self.HELP.keys(): + for what in self._HELP.keys(): if action.startswith(what): print("Help on %s" % what) - print(self.HELP[what]) + print(self._HELP[what]) break else: print("Help on commands") - print(self.HELP["help"]) - print("Valid actions: " + ", ".join(self.HELP.keys())) + print(self._HELP["help"]) + print("Valid actions: " + ", ".join(self._HELP.keys())) print("Valid parameters: " + ", ".join(self.PARAMETERS)) elif action == "get": # get wavelength if (len(words) >= 2): @@ -813,7 +813,7 @@ class AbstractCalibration(object): else: print("No a parameter: %s" % param) else: - print(self.HELP[action]) + print(self._HELP[action]) elif action == "set": # set wavelength 1e-10 if (len(words) in (3, 4)) and words[1] in self.PARAMETERS: @@ -830,7 +830,7 @@ class AbstractCalibration(object): scale = unit.scale setattr(self.geoRef, param, value / scale) else: - print(self.HELP[action]) + print(self._HELP[action]) elif action == "fix": # fix wavelength if (len(words) >= 2): for param in words[1:]: @@ -840,7 +840,7 @@ class AbstractCalibration(object): else: print("No a parameter: %s" % param) else: - print(self.HELP[action]) + print(self._HELP[action]) elif action == "free": # free wavelength if (len(words) >= 2): for param in words[1:]: @@ -850,7 +850,7 @@ class AbstractCalibration(object): else: print("No a parameter: %s" % param) else: - print(self.HELP[action]) + print(self._HELP[action]) elif action == "recalib": max_rings = None @@ -922,9 +922,9 @@ class AbstractCalibration(object): self.geoRef.__getattribute__("set_%s" % param)(value) self.geoRef.__getattribute__("set_%s_max" % param)(value_max) else: - print(self.HELP[action]) + print(self._HELP[action]) else: - print(self.HELP[action]) + print(self._HELP[action]) elif action == "bounds": readFloatFromKeyboard("Enter Distance in meter " "(or dist_min[%.3f] dist[%.3f] dist_max[%.3f]):\t " % @@ -1037,9 +1037,9 @@ class AbstractCalibration(object): else: print("No such parameter %s" % param) else: - print(self.HELP[action]) + print(self._HELP[action]) elif action == "chiplot": - print(self.HELP[action]) + print(self._HELP[action]) rings = None if len(words) > 1: try: @@ -1049,7 +1049,7 @@ class AbstractCalibration(object): self.chiplot(rings) elif action == "delete": if len(words) < 2: - print(self.HELP[action]) + print(self._HELP[action]) else: for code in words[1:]: self.peakPicker.remove_grp(code) From 45b35db79a17fd9c600a4aa312808cff02fc7a63 Mon Sep 17 00:00:00 2001 From: Valentin Valls Date: Fri, 17 May 2019 11:51:36 +0200 Subject: [PATCH 7/9] Update rst man --- doc/source/img/integrate.png | Bin 84137 -> 67076 bytes doc/source/man/pyFAI-calib2.rst | 264 +++++++++++------------------ doc/source/man/pyFAI-drawmask.rst | 2 + doc/source/man/pyFAI-integrate.rst | 64 ++++--- 4 files changed, 134 insertions(+), 196 deletions(-) diff --git a/doc/source/img/integrate.png b/doc/source/img/integrate.png index 977df4dec3cfa6fd1d143e7d318d6adcb3e9ca83..1dacf05011bc79b9c7cd5289e1bad649e573b54d 100644 GIT binary patch literal 67076 zcmbTe2RPRM`!;?nE0s}MA<{%yAthUsl!%f&QVAI$5{hJGB*}=uI&R2bZ|L6D}&p4jre}DTNeBJkZy~cH&*Lj}T9dP`Z+FFK<3=|4w?cqZz+7!wP ze+p&g7(Ffi;;kS-qb8M@5N=<-i~5oDLs7 zNY_ilvWjb^a>ln53WbkySVd9Cwe8op%X%AHI_O46gn3vE^{BG=sy4Ac<_`=s(%O}E zBuL9*^Mwrt&u;t6Rv89YvmGrOyVH}SqSf@MGLUbbkhyYzt<~deO_o0vw?w*~zHX_Y zRW|a&ZR)T~fBn954Y8b_?hW-j-Tw@*NNij?K0f|PJB2zz-M7A8C}t&(o}S8#E0wYIj_{Q2{TFS2g4`)C){ix)5Khub8}+uAlZG&G2ci<{rV0W8Hd;^N}u zjRT$w9PjS$jpXFwQg#{XkTooDIy}&rK&PRh(W4nviI3k*t*C(e$(lWL?%WZ< zmYSO6)*`{Q)I3cU9mSO@{Ex>aEW3ZWCI^aS7kOBptB;XBw%|EZu3Ue*U?ZF4yDT?d zg{;|MZP_Qa^H)~SJ_-qzT$-F!Iy@-pP2oJVlmDK_aA4XItLXs$)TAGr(UfZ!lD6Nu z7b&3dot~eim@&?<{k+HJ7rCDbmTo*)>!-23BK+xl`)&Q(JFLED)?9sJ{IbL2Dd(=; z8}591um55llkV7zZEtCZs{!k&$dA9*v*^llMxTxv`@-H})b-+W5jCx?92ytrYqZng*FWIWwg+*I2L>B+NsdzGZQw_O7Cwb91K?#VWszwbKg(l z6B0UNEkFJEr1!p7RCFMH@#CjYJ|!h`XT+mV zF45F^IF!D8`LgQ3M7xB%iIKCL!$ad;rCnJ9Ru2P`$3LELs;O@%Z!z#J`*pb2^t|b{ zjJHFJ%w$kLJr;9%JGRd}`Wb7B7Uy=K}qoP#K z#J}xiPNhlK!;D$Bl~-IU=0_&kC&KD-9^Mk-&`~wYzxn3}=fLMLJl=d=H4mSPnl*`X zaB;GwhVs#Wz^y8Zm4;k$bbQo!zH+cta%rM!@%-m!tF%9T9FyM6GWoN$r&lb&)LM5n zCjI=d2qlPTYSV#2m+F_v4X zr4>W1dI|S@Y50YWt1~)15+Y3GxYG3X=4X|jeHmZ*ydy6FYbDvzit7FIxW@K`goc8m zJWa=Z?x*k7%sRW}M|a9mom5}_XSkV0R>oPu*!V$%$M(myZ<{JPO4h$Io4mRE1O1AU zj)j$fzB?)i`;-`l9Nd#sreLz1*dr6dw=QgJmcw*ohC4gQMvkt5fKM}ypQcBr;{p|n z-Mi|Jc5eA&BV9!2MnyUHu#`d>=xfvx3Kdu_-!fNnW@<;WR{F*>;+$j+SShPDWmw$$ z{d<^Y!@9uCf}elGi`qx}VUC^COY zwXØ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

aQ-B?O7vDv@u9 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�gStns}Nki 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 AxBvhE diff --git a/doc/source/man/pyFAI-calib2.rst b/doc/source/man/pyFAI-calib2.rst index c866454b..77211720 100644 --- a/doc/source/man/pyFAI-calib2.rst +++ b/doc/source/man/pyFAI-calib2.rst @@ -13,16 +13,16 @@ without a priori knowledge of your setup. You will need to provide a calibrant or a "d-spacing" file containing the spacing of Miller plans in Angstrom (in decreasing order). -Calibrants available: Ni, CrOx, NaCl, Si_SRM640e, Si_SRM640d, Si_SRM640a, -Si_SRM640c, alpha_Al2O3, Cr2O3, AgBh, Si_SRM640, CuO, PBBA, -Si_SRM640b, mock, quartz, C14H30O, cristobaltite, Si, LaB6, CeO2, LaB6_SRM660a, -LaB6_SRM660b, LaB6_SRM660c, TiO2, ZnO, Al, Au or search in the -American Mineralogist database: http://rruff.geo.arizona.edu/AMS/amcsd.php +Calibrants available: ``Ni``, ``CrOx``, ``NaCl``, ``Si_SRM640e``, ``Si_SRM640d``, ``Si_SRM640a``, +``Si_SRM640c``, ``alpha_Al2O3``, ``Cr2O3``, ``AgBh``, ``Si_SRM640``, ``CuO``, ``PBBA``, +``Si_SRM640b``, ``quartz``, ``C14H30O``, ``cristobaltite``, ``Si``, ``LaB6``, ``CeO2``, ``LaB6_SRM660a``, +``LaB6_SRM660b``, ``LaB6_SRM660c``, ``TiO2``, ``ZnO``, ``Al``, ``Au`` or search in the +`American Mineralogist database `_. Usage: ------ -pyFAI-calib2 [options] [input_image.edf] +``pyFAI-calib2 [options] [input_image.edf]`` Everything can be set by the GUI, but here are the command-line arguments. @@ -30,171 +30,97 @@ Options: -------- positional arguments: - FILE List of files to calibrate + FILE List of files to calibrate optional arguments: - -h, --help - show this help message and exit - - -V, --version - show program's version number and exit - - -o FILE, --out FILE - Filename where processed image is saved - - -v, --verbose - switch to debug/verbose mode - - --debug - Set logging system in debug mode - - -c FILE, --calibrant FILE - Calibrant name or file containing d-spacing of the reference sample (case sensitive) - - -w WAVELENGTH, --wavelength WAVELENGTH - wavelength of the X-Ray beam in Angstrom. - - -e ENERGY, --energy ENERGY - energy of the X-Ray beam in keV (hc=12.3984197396keV.A). - - -P POLARIZATION_FACTOR, --polarization POLARIZATION_FACTOR - polarization factor, from -1 (vertical) to +1 (horizontal), default is None (no correction), synchrotrons are around 0.95 - - -D DETECTOR_NAME, --detector DETECTOR_NAME - Detector name (instead of pixel size+spline) - - -m MASK, --mask MASK - file containing the mask (for image reconstruction) - - -p PIXEL, --pixel PIXEL - size of the pixel in micron - - -i FILE, --poni FILE - file containing the diffraction parameter (poni-file). - - -b BACKGROUND, --background BACKGROUND - Automatic background subtraction if no value are provided - - -d DARK, --dark DARK - list of comma separated dark images to average and subtract - - -f FLAT, --flat FLAT - list of comma separated flat images to average and divide - - -s SPLINE, --spline SPLINE - spline file describing the detector distortion - - -n NPT, --pt NPT - file with datapoints saved. Default: basename.npt - - --filter FILTER - select the filter, either mean(default), max or median - - -l DISTANCE, --distance DISTANCE - sample-detector distance in millimeter. Default: 100mm - - --dist DIST - sample-detector distance in meter. Default: 0.1m - - --poni1 PONI1 - poni1 coordinate in meter. Default: center of detector - - --poni2 PONI2 - poni2 coordinate in meter. Default: center of detector - - --rot1 ROT1 - rot1 in radians. default: 0 - - --rot2 ROT2 - rot2 in radians. default: 0 - - --rot3 ROT3 - rot3 in radians. default: 0 - - --fix-wavelength - fix the wavelength parameter. Default: Activated - - --free-wavelength - free the wavelength parameter. Default: Deactivated - - --fix-dist - fix the distance parameter - - --free-dist - free the distance parameter. Default: Activated - - --fix-poni1 - fix the poni1 parameter - - --free-poni1 - free the poni1 parameter. Default: Activated - - --fix-poni2 - fix the poni2 parameter - - --free-poni2 - free the poni2 parameter. Default: Activated - - --fix-rot1 - fix the rot1 parameter - - --free-rot1 - free the rot1 parameter. Default: Activated - - --fix-rot2 - fix the rot2 parameter - - --free-rot2 - free the rot2 parameter. Default: Activated - - --fix-rot3 - fix the rot3 parameter - - --free-rot3 - free the rot3 parameter. Default: Activated - - --npt NPT_1D - Number of point in 1D integrated pattern, Default: 1024 - - --npt-azim NPT_2D_AZIM - Number of azimuthal sectors in 2D integrated images. Default: 360 - - --npt-rad NPT_2D_RAD - Number of radial bins in 2D integrated images. Default: 400 - - --qtargs QTARGS - Arguments propagated to Qt - - --tilt Allow initially detector tilt to be refined (rot1, rot2, rot3). Default: Activated - - --no-tilt - Deactivated tilt refinement and set all rotation to 0 - - --saturation SATURATION - consider all pixel>max*(1-saturation) as saturated and reconstruct them, default: 0 (deactivated) - - --weighted - weight fit by intensity, by default not. - - --unit UNIT - Valid units for radial range: 2th_deg, 2th_rad, q_nm^-1, q_A^-1, r_mm. Default: 2th_deg - - --no-gui - force the program to run without a Graphical interface - - --no-interactive - force the program to run and exit without prompting for refinements - - -r, --reconstruct - Reconstruct image where data are masked or <0 (for Pilatus detectors or detectors with modules) - - -g GAUSSIAN, --gaussian GAUSSIAN - Size of the gaussian kernel. Size of the gap (in pixels) between two consecutive rings, by default 100 Increase the value if the arc is not complete; decrease the value if arcs are mixed - together. - - --square - Use square kernel shape for neighbor search instead of diamond shape - + -h, --help show this help message and exit + -V, --version show program's version number and exit + -o FILE, --out FILE Filename where processed image is saved + -v, --verbose switch to debug/verbose mode + --debug Set logging system in debug mode + --opengl, --gl Enable OpenGL rendering (else matplotlib is used) + -c FILE, --calibrant FILE + Calibrant name or file containing d-spacing of the + reference sample (case sensitive) + -w WAVELENGTH, --wavelength WAVELENGTH + wavelength of the X-Ray beam in Angstrom. + -e ENERGY, --energy ENERGY + energy of the X-Ray beam in keV + (hc=12.398419739640717keV.A). + -P POLARIZATION_FACTOR, --polarization POLARIZATION_FACTOR + polarization factor, from -1 (vertical) to +1 + (horizontal), default is None (no correction), + synchrotrons are around 0.95 + -D DETECTOR_NAME, --detector DETECTOR_NAME + Detector name (instead of pixel size+spline) + -m MASK, --mask MASK file containing the mask (for image reconstruction) + -p PIXEL, --pixel PIXEL + size of the pixel in micron + -s SPLINE, --spline SPLINE + spline file describing the detector distortion + -n NPT, --pt NPT file with datapoints saved. Example: basename.npt + -i FILE, --poni FILE file containing the diffraction parameter (poni-file) + [not used]. + -b BACKGROUND, --background BACKGROUND + Automatic background subtraction if no value are + provided [not used] + -d DARK, --dark DARK list of comma separated dark images to average and + subtract [not used] + -f FLAT, --flat FLAT list of comma separated flat images to average and + divide [not used] + --filter FILTER select the filter, either mean(default), max or median + [not used] + -l DIST_MM, --distance DIST_MM + sample-detector distance in millimeter. Default: 100mm + --dist DIST sample-detector distance in meter. Default: 0.1m + --poni1 PONI1 poni1 coordinate in meter. Default: center of detector + --poni2 PONI2 poni2 coordinate in meter. Default: center of detector + --rot1 ROT1 rot1 in radians. default: 0 + --rot2 ROT2 rot2 in radians. default: 0 + --rot3 ROT3 rot3 in radians. default: 0 + --fix-wavelength fix the wavelength parameter. Default: Activated + --free-wavelength free the wavelength parameter. Default: Deactivated + --fix-dist fix the distance parameter + --free-dist free the distance parameter. Default: Activated + --fix-poni1 fix the poni1 parameter + --free-poni1 free the poni1 parameter. Default: Activated + --fix-poni2 fix the poni2 parameter + --free-poni2 free the poni2 parameter. Default: Activated + --fix-rot1 fix the rot1 parameter + --free-rot1 free the rot1 parameter. Default: Activated + --fix-rot2 fix the rot2 parameter + --free-rot2 free the rot2 parameter. Default: Activated + --fix-rot3 fix the rot3 parameter + --free-rot3 free the rot3 parameter. Default: Activated + --npt NPT_1D Number of point in 1D integrated pattern, Default: + 1024 + --npt-azim NPT_2D_AZIM + Number of azimuthal sectors in 2D integrated images. + Default: 360 + --npt-rad NPT_2D_RAD Number of radial bins in 2D integrated images. + Default: 400 + --qtargs QTARGS Arguments propagated to Qt + --tilt Allow initially detector tilt to be refined (rot1, + rot2, rot3). Default: Activated + --no-tilt Deactivated tilt refinement and set all rotation to 0 + --saturation SATURATION + consider all pixel>max*(1-saturation) as saturated and + reconstruct them, default: 0 (deactivated) + --weighted weight fit by intensity, by default not. + --unit UNIT Valid units for radial range: 2th_deg, 2th_rad, + q_nm^-1, q_A^-1, r_mm. Default: 2th_deg + --no-gui force the program to run without a Graphical interface + --no-interactive force the program to run and exit without prompting + for refinements + -r, --reconstruct Reconstruct image where data are masked or <0 (for + Pilatus detectors or detectors with modules) + -g GAUSSIAN, --gaussian GAUSSIAN + Size of the gaussian kernel. Size of the gap (in + pixels) between two consecutive rings, by default 100 + Increase the value if the arc is not complete; + decrease the value if arcs are mixed together. + --square Use square kernel shape for neighbor search instead of + diamond shape Tips & Tricks ------------- diff --git a/doc/source/man/pyFAI-drawmask.rst b/doc/source/man/pyFAI-drawmask.rst index 72f85232..b88022e7 100644 --- a/doc/source/man/pyFAI-drawmask.rst +++ b/doc/source/man/pyFAI-drawmask.rst @@ -1,6 +1,8 @@ Mask generation tool: pyFAI-drawmask ==================================== +.. _pyFAI-drawmask: + Purpose ------- diff --git a/doc/source/man/pyFAI-integrate.rst b/doc/source/man/pyFAI-integrate.rst index a09564e5..0f43bb6b 100644 --- a/doc/source/man/pyFAI-integrate.rst +++ b/doc/source/man/pyFAI-integrate.rst @@ -4,7 +4,7 @@ Integration tool: pyFAI-integrate Purpose ------- -PyFAI-integrate is a graphical interface (based on Python/Qt4) to perform azimuthal integration +PyFAI-integrate is a graphical interface (based on Python/Qt5) to perform azimuthal integration on a set of files. It exposes most of the important options available within pyFAI and allows you to select a GPU (or an openCL platform) to perform the calculation on. @@ -16,36 +16,46 @@ to select a GPU (or an openCL platform) to perform the calculation on. Usage ----- -pyFAI-integrate [options] file1.edf file2.edf ... +``pyFAI-integrate [options] file1.edf file2.edf ...`` Options: -------- - -h, --help show this help message and exit - -V, --version show program's version number and exit - -v, --verbose switch to verbose/debug mode - -o OUTPUT, --output OUTPUT - Directory or file where to store the output data - -f FORMAT, --format FORMAT - output data format (can be HDF5) - -s SLOW, --slow-motor SLOW - Dimension of the scan on the slow direction (makes - sense only with HDF5) - -r RAPID, --fast-motor RAPID - Dimension of the scan on the fast direction (makes - sense only with HDF5) - --no-gui Process the dataset without showing the user - interface. - -j JSON, --json JSON Configuration file containing the processing to be - done - --monitor-name MONITOR_KEY - Name of the monitor in the header of each input files. - If defined the contribution of each input file is - divided by the monitor. If the header does not contain - or contains a wrong value, the contribution of the - input file is ignored. On EDF files, values from - 'counter_pos' can accessed by using the expected - mnemonic. For example 'counter/bmon'. + positional arguments: + FILE Files to be integrated + + optional arguments: + -h, --help show this help message and exit + -V, --version show program's version number and exit + -v, --verbose switch to verbose/debug mode + --debug Set logging system in debug mode + -o OUTPUT, --output OUTPUT + Directory or file where to store the output data + -f FORMAT, --format FORMAT + output data format (can be HDF5) + -s SLOW, --slow-motor SLOW + Dimension of the scan on the slow direction (makes + sense only with HDF5) + -r RAPID, --fast-motor RAPID + Dimension of the scan on the fast direction (makes + sense only with HDF5) + --no-gui Process the dataset without showing the user + interface. + -j JSON, --json JSON Configuration file containing the processing to be + done + --monitor-name MONITOR_KEY + Name of the monitor in the header of each input files. + If defined the contribution of each input file is + divided by the monitor. If the header does not contain + or contains a wrong value, the contribution of the + input file is ignored. On EDF files, values from + 'counter_pos' can be accessed by using the expected + mnemonic. For example 'counter/bmon'. + --delete Delete the destination file if already exists + --append Append the processing to the destination file using an + available group (HDF5 output) + --overwrite Overwrite the entry of the destination file if it + already exists (HDF5 output) Tips & Tricks: -------------- From a49290dc630c3a12d335e579002745bf20d3a04a Mon Sep 17 00:00:00 2001 From: Valentin Valls Date: Fri, 17 May 2019 11:52:19 +0200 Subject: [PATCH 8/9] Fix api doc tree --- doc/source/api/app/index.rst | 3 --- doc/source/api/engines/index.rst | 3 --- doc/source/api/ext/index.rst | 3 --- doc/source/api/gui/dialog.rst | 3 --- doc/source/api/gui/helper.rst | 3 --- doc/source/api/gui/index.rst | 3 --- doc/source/api/gui/model.rst | 3 --- doc/source/api/gui/tasks.rst | 3 --- doc/source/api/gui/widgets.rst | 3 --- doc/source/api/io/index.rst | 3 --- doc/source/api/modules.rst | 2 +- doc/source/api/pyFAI.rst | 3 --- doc/source/api/resources/index.rst | 3 --- pyFAI/ext/new_diagram.uxf | 1 + 14 files changed, 2 insertions(+), 37 deletions(-) create mode 100644 pyFAI/ext/new_diagram.uxf diff --git a/doc/source/api/app/index.rst b/doc/source/api/app/index.rst index ad1ab08b..8779307a 100644 --- a/doc/source/api/app/index.rst +++ b/doc/source/api/app/index.rst @@ -1,9 +1,6 @@ pyFAI.app package ================= -Submodules ----------- - pyFAI.app.average module ------------------------ diff --git a/doc/source/api/engines/index.rst b/doc/source/api/engines/index.rst index 6fc33d55..1c503fdf 100644 --- a/doc/source/api/engines/index.rst +++ b/doc/source/api/engines/index.rst @@ -1,9 +1,6 @@ pyFAI.engines package ===================== -Submodules ----------- - pyFAI.engines.CSR_engine module ------------------------------- diff --git a/doc/source/api/ext/index.rst b/doc/source/api/ext/index.rst index 92a2f2da..8f6eabb6 100644 --- a/doc/source/api/ext/index.rst +++ b/doc/source/api/ext/index.rst @@ -1,9 +1,6 @@ pyFAI.ext package ================= -Submodules ----------- - pyFAI.ext.bilinear module ------------------------- diff --git a/doc/source/api/gui/dialog.rst b/doc/source/api/gui/dialog.rst index fe885b9d..62b2015e 100644 --- a/doc/source/api/gui/dialog.rst +++ b/doc/source/api/gui/dialog.rst @@ -1,9 +1,6 @@ pyFAI.gui.dialog package ======================== -Submodules ----------- - pyFAI.gui.dialog.Detector3dDialog module ---------------------------------------- diff --git a/doc/source/api/gui/helper.rst b/doc/source/api/gui/helper.rst index d25c27ff..537eb2ed 100644 --- a/doc/source/api/gui/helper.rst +++ b/doc/source/api/gui/helper.rst @@ -1,9 +1,6 @@ pyFAI.gui.helper package ======================== -Submodules ----------- - pyFAI.gui.helper.MarkerManager module ------------------------------------- diff --git a/doc/source/api/gui/index.rst b/doc/source/api/gui/index.rst index e17f8a70..87075225 100644 --- a/doc/source/api/gui/index.rst +++ b/doc/source/api/gui/index.rst @@ -13,9 +13,6 @@ Subpackages utils widgets -Submodules ----------- - pyFAI.gui.ApplicationContext module ----------------------------------- diff --git a/doc/source/api/gui/model.rst b/doc/source/api/gui/model.rst index dc61a455..2f46e2a6 100644 --- a/doc/source/api/gui/model.rst +++ b/doc/source/api/gui/model.rst @@ -1,9 +1,6 @@ pyFAI.gui.model package ======================= -Submodules ----------- - pyFAI.gui.model.AbstractModel module ------------------------------------ diff --git a/doc/source/api/gui/tasks.rst b/doc/source/api/gui/tasks.rst index af5c183a..18e81230 100644 --- a/doc/source/api/gui/tasks.rst +++ b/doc/source/api/gui/tasks.rst @@ -1,9 +1,6 @@ pyFAI.gui.tasks package ======================= -Submodules ----------- - pyFAI.gui.tasks.AbstractCalibrationTask module ---------------------------------------------- diff --git a/doc/source/api/gui/widgets.rst b/doc/source/api/gui/widgets.rst index 6b813913..b31c56c3 100644 --- a/doc/source/api/gui/widgets.rst +++ b/doc/source/api/gui/widgets.rst @@ -1,9 +1,6 @@ pyFAI.gui.widgets package ========================= -Submodules ----------- - pyFAI.gui.widgets.AdvancedComboBox module ----------------------------------------- diff --git a/doc/source/api/io/index.rst b/doc/source/api/io/index.rst index 2b90f9ef..30b57a02 100644 --- a/doc/source/api/io/index.rst +++ b/doc/source/api/io/index.rst @@ -1,9 +1,6 @@ pyFAI.io package ================ -Submodules ----------- - pyFAI.io.image module --------------------- diff --git a/doc/source/api/modules.rst b/doc/source/api/modules.rst index f8357f99..b49bfc05 100644 --- a/doc/source/api/modules.rst +++ b/doc/source/api/modules.rst @@ -13,6 +13,6 @@ both the geometry (it inherits from Geometry, another class) and exposes important methods (functions) like integrate1d and integrate2d. .. toctree:: - :maxdepth: 4 + :maxdepth: 2 pyFAI diff --git a/doc/source/api/pyFAI.rst b/doc/source/api/pyFAI.rst index 196e62b6..45ec0e4e 100644 --- a/doc/source/api/pyFAI.rst +++ b/doc/source/api/pyFAI.rst @@ -1,9 +1,6 @@ pyFAI package ============= -Subpackages ------------ - .. toctree:: app/index diff --git a/doc/source/api/resources/index.rst b/doc/source/api/resources/index.rst index 415e96d3..13962d28 100644 --- a/doc/source/api/resources/index.rst +++ b/doc/source/api/resources/index.rst @@ -1,9 +1,6 @@ pyFAI.resources package ======================= -Submodules ----------- - pyFAI.resources.setup module ---------------------------- diff --git a/pyFAI/ext/new_diagram.uxf b/pyFAI/ext/new_diagram.uxf new file mode 100644 index 00000000..3651be4a --- /dev/null +++ b/pyFAI/ext/new_diagram.uxf @@ -0,0 +1 @@ + \ No newline at end of file From 98c928b552e73d1c4fbfd1dd96ba6aead18d1229 Mon Sep 17 00:00:00 2001 From: Valentin Valls Date: Fri, 17 May 2019 11:52:27 +0200 Subject: [PATCH 9/9] Typo doc --- pyFAI/utils/bayes.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/pyFAI/utils/bayes.py b/pyFAI/utils/bayes.py index 7b2e3b38..0bd8335d 100644 --- a/pyFAI/utils/bayes.py +++ b/pyFAI/utils/bayes.py @@ -54,7 +54,7 @@ class BayesianBackground(object): .. math:: z = y / sigma^2 - * if z<0: a quadratic behaviour is expected + * if z<0 a quadratic behaviour is expected * if z>>1 it is likely a bragg peak so the penalty should be small: log(z). * The spline is used to have a quadratic behaviour near 0 and the log one near the junction @@ -127,9 +127,11 @@ class BayesianBackground(object): def bayes_llk(cls, z): """Calculate actually the log-likelihood from a set of weighted error - Re implementation of: - (y<=0)*5*y**2 + (y>0)*(y<8)*pyFAI.utils.bayes.background.spline(y) + (y>=8)*(s1+log(abs(y)+1*(y<8))) - even slightly faster + Re implementation of the following code even slightly faster: + + .. code-block:: python + + (y<=0)*5*y**2 + (y>0)*(y<8)*pyFAI.utils.bayes.background.spline(y) + (y>=8)*(s1+log(abs(y)+1*(y<8))) :param float[:] z: weighted error :return: log likelihood