From c22804d17bc8546fe17c39b7622a044d23870d77 Mon Sep 17 00:00:00 2001 From: Valerio Mariani <valerio.mariani@desy.de> Date: Mon, 30 Oct 2017 17:23:40 +0100 Subject: [PATCH] Code clean-up --- cfel_crystfel.py | 56 ++--- cfel_cxi.py | 145 ++++++----- cfel_fabio.py | 12 +- cfel_geom.py | 27 +- cfel_hdf5.py | 6 +- cfel_optarg.py | 6 +- cfel_psana.py | 11 +- cfel_vtk.py | 101 ++++++-- doc/build/doctrees/cfelpyutils.doctree | Bin 137275 -> 157040 bytes doc/build/doctrees/environment.pickle | Bin 12789 -> 13920 bytes doc/build/doctrees/index.doctree | Bin 4876 -> 4923 bytes doc/build/doctrees/modules.doctree | Bin 2566 -> 2597 bytes doc/build/html/.buildinfo | 2 +- doc/build/html/_static/basic.css | 9 +- doc/build/html/_static/css3-mediaqueries.js | 2 +- doc/build/html/_static/doctools.js | 2 +- doc/build/html/_static/pygments.css | 4 + doc/build/html/_static/searchtools.js | 2 +- doc/build/html/_static/websupport.js | 2 +- doc/build/html/cfelpyutils.html | 257 ++++++++++++++------ doc/build/html/genindex.html | 61 ++++- doc/build/html/index.html | 12 +- doc/build/html/modules.html | 8 +- doc/build/html/objects.inv | Bin 647 -> 728 bytes doc/build/html/py-modindex.html | 8 +- doc/build/html/search.html | 8 +- doc/build/html/searchindex.js | 2 +- 27 files changed, 461 insertions(+), 282 deletions(-) diff --git a/cfel_crystfel.py b/cfel_crystfel.py index 8a87814..9df4d45 100644 --- a/cfel_crystfel.py +++ b/cfel_crystfel.py @@ -18,21 +18,19 @@ Utilities for interoperability with the CrystFEL software package. This module contains reimplementation of Crystfel functions and utilities. """ -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function -from __future__ import unicode_literals +from __future__ import (absolute_import, division, print_function, + unicode_literals) +import re from collections import OrderedDict from copy import deepcopy from math import sqrt -import re def _assplode_algebraic(value): items = [item for item in re.split('([+-])', value.strip()) if item != ''] - if len(items) != 0 and items[0] not in ('+', '-'): + if items and items[0] not in ('+', '-'): items.insert(0, '+') return [''.join((items[x], items[x + 1])) for x in range(0, len(items), 2)] @@ -43,7 +41,7 @@ def _dir_conv(direction_x, direction_y, direction_z, value): items = _assplode_algebraic(value) - if len(items) == 0: + if items: raise RuntimeError('Invalid direction: {}.'.format(value)) for item in items: @@ -78,7 +76,7 @@ def _set_dim_structure_entry(key, value, panel): dim_index = int(key[3]) if dim_index > len(dim) - 1: - for index in range(len(dim), dim_index + 1): + for _ in range(len(dim), dim_index + 1): dim.append(None) if value == 'ss' or value == 'fs' or value == '%': @@ -331,21 +329,20 @@ def _find_min_max_d(detector): def load_crystfel_geometry(filename): """Loads a CrystFEL geometry file into a dictionary. - + Reimplements the get_detector_geometry_2 function from CrystFEL amost verbatim. Returns a dictionary with the geometry information. Entries in the geometry file appears as keys in the returned dictionary. For a full documentation on the CrystFEL geometry format, see: - + tfel/manual-crystfel_geometry.html - + Args: - + filename (str): filename of the geometry file - + Returns: - + detector (dict): dictionary with the geometry loaded from the file - """ fh = open(filename, 'r') @@ -460,7 +457,7 @@ def load_crystfel_geometry(filename): else: _parse_field_bad(path[1], value, curr_bad) - if len(detector['panels']) == 0: + if not detector['panels']: raise RuntimeError("No panel descriptions in geometry file.") num_placeholders_in_panels = None @@ -534,26 +531,23 @@ def load_crystfel_geometry(filename): if dim_length == 1: raise RuntimeError('Number of dim coordinates must be at least two.') - for panel_name, panel in detector['panels'].items(): + for panel in detector['panels'].values(): - if 'origin_min_fs' not in panel: - raise RuntimeError('Please specify the minimum fs coordinate for panel {}.'.format(panel_name)) + if panel['origin_min_fs'] < 0: + raise RuntimeError('Please specify the minimum fs coordinate for panel {}.'.format(panel['name'])) - if 'origin_max_fs' not in panel: - raise RuntimeError('Please specify the maximum fs coordinate for panel {}.'.format(panel_name)) + if panel['origin_max_fs'] < 0: + raise RuntimeError('Please specify the maximum fs coordinate for panel {}.'.format(panel['name'])) - if 'origin_min_ss' not in panel: - raise RuntimeError('Please specify the minimum ss coordinate for panel {}.'.format(panel_name)) + if panel['origin_min_ss'] < 0: + raise RuntimeError('Please specify the minimum ss coordinate for panel {}.'.format(panel['name'])) - if 'origin_max_ss' not in panel: - raise RuntimeError('Please specify the maximum ss coordinate for panel {}.'.format(panel_name)) + if panel['origin_max_ss'] < 0: + raise RuntimeError('Please specify the maximum ss coordinate for panel {}.'.format(panel['name'])) if panel['cnx'] is None: - raise RuntimeError('Please specify the corner X coordinate for panel {}.'.format(panel_name)) + raise RuntimeError('Please specify the corner X coordinate for panel {}.'.format(panel['name'])) - if panel['cny'] is None: - raise RuntimeError('Please specify the corner Y coordinate for panel {}.'.format(panel_name)) - if panel['clen'] is None and panel['clen_from'] is None: raise RuntimeError('Please specify the camera length for panel {}.'.format(panel['name'])) @@ -583,12 +577,12 @@ def load_crystfel_geometry(filename): if bad_region['is_fsss'] == 99: raise RuntimeError('Please specify the coordinate ranges for bad region {}.'.format(bad_region['name'])) - for group in detector['rigid_groups'].keys(): + for group in detector['rigid_groups']: for name in detector['rigid_groups'][group]: if name not in detector['panels']: raise RuntimeError('Cannot add panel to rigid_group. Panel not found: {}'.format(name)) - for group_collection in detector['rigid_group_collections'].keys(): + for group_collection in detector['rigid_group_collections']: for name in detector['rigid_group_collections'][group_collection]: if name not in detector['rigid_groups']: raise RuntimeError('Cannot add rigid_group to collection. Rigid group not found: {}'.format(name)) diff --git a/cfel_cxi.py b/cfel_cxi.py index 5a2293e..99d36b4 100644 --- a/cfel_cxi.py +++ b/cfel_cxi.py @@ -15,20 +15,20 @@ """ Utilities for writing multi-event files in the CXIDB format. -This module contains utilities to write files that adhere to the CXIDB file format: +This module contains utilities to write files that adhere to the CXIDB file format: http://www.cxidb.org/cxi.html . """ -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function -from __future__ import unicode_literals +from __future__ import (absolute_import, division, print_function, + unicode_literals) from collections import namedtuple + import h5py import numpy + _CXISimpleEntry = namedtuple('SimpleEntry', ['path', 'data', 'overwrite']) @@ -64,11 +64,7 @@ class _Stack: self._chunk_size = chunk_size def is_there_data_to_write(self): - - if self._data_to_write is not None: - return True - else: - return False + return self._data_to_write is not None def write_initial_slice(self, file_handle, max_num_slices): @@ -132,27 +128,27 @@ class CXIWriter: """Writing of multi-event CXIDB files. Implements a simple low-level CXIDB file format writer for multi event files. it allows the user to write data - "stacks" in the CXIDB files, making sure that the entries in all stacks are synchronized. - + "stacks" in the CXIDB files, making sure that the entries in all stacks are synchronized. + A CXI Writer instance manages one file. A user can add a stack to a CXI Writer instance with the - add_stack_to_writer function, which also writes the first entry in the stack. The user can then add to the writer + add_stack_to_writer function, which also writes the first entry in the stack. The user can then add to the writer all the stacks that he wants in the file. Once all stacks are added, the user initializes them with the initialize_stacks function. After initialization, no more stacks can be added. Instead, entries can be appended to - the existing stacks, using the append_data_to_stack function. - + the existing stacks, using the append_data_to_stack function. + A "slice" (a set of synced entries in all the stacks in the file) can be written to the a file only after an entry has been appended to all stacks in the file. Conversely, after an entry has been appended to a stack, the user cannot append another entry before a slice is written. This ensures synchronization of the data in all the stacks. - + A file can be closed at any time. In any case, the writer will not allow a file to contain more than the number_of_entries specified during instantiation. - + Simple non-stack entries can be written to the file at any time, before or after stack initialization (provided of course that the file is open). Entries and stacks will general never be overwritten unless the overwrite parameter is set to True. - + Example of usage of the stack API: - + c1 = 0 c2 = 0 @@ -197,13 +193,13 @@ class CXIWriter: def __init__(self, filename, max_num_slices=5000): """Instantiates a CXI Writer, managing one file. - + Instantiates a CXI Writer, responsible for writing data into one file. - + Args: - + filename (str): name of the file managed by the CXI Writer - + max_num_slices (int): maximum number of slices for the stacks in the file (default 5000) """ @@ -236,31 +232,31 @@ class CXIWriter: def add_stack_to_writer(self, name, path, initial_data, axes=None, compression=True, chunk_size=None, overwrite=True): """Adds a new stack to the file. - + Adds a new stack to the CXI Writer instance. The user must provide a name for the stack, that will identify the stack in all subsequents operations. The user must also provide the data that will be written as the initial entry in the stack (initial_data). This initial entry is used to set the size and type of data that the stack will hold and these parameters are in turn be used to validate all data that is subsequently appended to the stack. - + Args: - + name (str): stack name. - + path (str): path in the hdf5 file where the stack will be written. - - initial_data (Union[numpy.ndarray, bytes, int, float]: initial entry in the stack. It gets written to the + + initial_data (Union[numpy.ndarray, bytes, int, float]: initial entry in the stack. It gets written to the stack as slice 0. Its characteristics are used to validate all data subsequently appended to the stack. - + axes (bytes): the 'axes' attribute for the stack, as defined by the CXIDB file format. - + compression (Union[None, bool,str]): compression parameter for the stack. This parameters works in the same way as the normal compression parameter from h5py. The default value of this parameter is True. - + chunk_size (Union[None, tuple]): HDF5 chuck size for the stack. If this parameter is set to None, the - CXI writer will compute a chuck size automatically (this is the default behavior). Otherwise, the writer + CXI writer will compute a chuck size automatically (this is the default behavior). Otherwise, the writer will use the provided tuple to set the chunk size. - + overwrite (bool): if set to True, a stack already existing at the same location will be overwritten. If set to False, an attempt to overwrite a stack will raise an error. """ @@ -276,7 +272,7 @@ class CXIWriter: for entry in self._cxi_stacks: if path == self._cxi_stacks[entry].path: if overwrite is True: - del (self._cxi_stacks[entry]) + del self._cxi_stacks[entry] else: raise RuntimeError('Cannot write the entry. Data is already present at the specified path.') @@ -285,19 +281,19 @@ class CXIWriter: def write_simple_entry(self, name, path, data, overwrite=False): """Writes a simple, non-stack entry in the file. - + Writes a simple, non-stack entry in the file, at the specified path. A simple entry can be written at all times, before or after the stack initialization. The user must provide a name that identifies the entry for further operations (for example, creating a link). - + Args: - + name (str): entry name - + path (str): path in the hdf5 file where the entry will be written. - + data (Union[numpy.ndarray, bytes, int, float]): data to write - + overwrite (bool): if set to True, an entry already existing at the same location will be overwritten. If set to False, an attempt to overwrite an entry will raise an error. """ @@ -309,7 +305,7 @@ class CXIWriter: if path in self._fh: if overwrite is True: - del (self._fh[path]) + del self._fh[path] else: raise RuntimeError('Cannot create the the entry. An entry already exists at the specified path.') @@ -324,24 +320,24 @@ class CXIWriter: def create_link(self, name, path, overwrite=False): """Creates a link to a stack or entry. - + Creates a link in the file, at the path specified, pointing to the stack or the entry identified by the provided name. If a link or entry already exists at the specified path, it is deleted and replaced only if the value of the overwrite parameter is True. - + Args: - + name (str): name of the stack or entry to which the link points. - + path (str): path in the hdf5 where the link is created. - + overwrite (bool): if set to True, an entry already existing at the same location will be overwritten. If set to False, an attempt to overwrite an entry will raise an error. """ if path in self._fh: if overwrite is True: - del (self._fh[path]) + del self._fh[path] else: raise RuntimeError('Cannot create the link. An entry already exists at the specified path.') @@ -357,23 +353,23 @@ class CXIWriter: def create_link_to_group(self, group, path, overwrite=False): """Creates a link to an HDF5 group. - + Creates a link to an HDF5 group (as opposed to a simple entry or stack). If a link or entry already exists at the specified path, it is deleted and replaced only if the value of the overwrite parameter is True. - Args: + Args: group (str): internal HDF5 path of the group to which the link points. - + path (str): path in the hdf5 where the link is created. - + overwrite (bool): if set to True, an entry already existing at the same location will be overwritten. If set to False, an attempt to overwrite an entry will raise an error. """ if path in self._fh: if overwrite is True: - del (self._fh[path]) + del self._fh[path] else: raise RuntimeError('Cannot create the link. An entry already exists at the specified path.') @@ -411,8 +407,8 @@ class CXIWriter: def initialize_stacks(self): """Initializes the stacks. - - Initializes the stacks in the CXI Writer instance. This fixes the number and type of stacks in the file. No + + Initializes the stacks in the CXI Writer instance. This fixes the number and type of stacks in the file. No stacks can be added to the CXI Writer after initialization. """ @@ -435,15 +431,15 @@ class CXIWriter: def append_data_to_stack(self, name, data): """Appends data to a stack. - + Appends data to a stack, validating the data to make sure that the data type and size match the previous entries in the stack. Only one entry can be appended to each stack before writing a slice across all stacks with the write_slice_and_increment. - + Args: - + name (str): stack name, defining the stack to which the data will be appended. - + data (Union[numpy.ndarray, bytes, int, float]: data to write. The data will be validated against the type and size of previous entries in the stack. """ @@ -463,10 +459,10 @@ class CXIWriter: def write_stack_slice_and_increment(self): """Writes a slice across all stacks and resets the writer for the next slice. - + Writes a slice across all stacks in the file. It checks that an entry has been appended to each stack, and writes all the entries on top of the relevant stacks in one go. If an entry is missing in a stack, the function - will raise an error. After writing the slice, the function resets the writer to allow again appending data to + will raise an error. After writing the slice, the function resets the writer to allow again appending data to the stacks. """ @@ -491,12 +487,12 @@ class CXIWriter: def get_file_handle(self): """Access to the naked h5py file handle. - + This function allows access to the a naked h5py handle for the file managed by the CXI Writer. This allowa operations on the file that are not covered by CXI Writer API. Use it at your own risk. - + Returns: - + fh (h5py.File): an h5py file handle to the file managed by the writer. """ @@ -507,11 +503,11 @@ class CXIWriter: def stacks_are_initialized(self): """Checks if stacks are initialized. - + Checks the status of the stacks in the file and returns the status to the user. - + Returns: - + status (bool): True if the stacks are initialized, False otherwise """ @@ -533,21 +529,16 @@ class CXIWriter: """ - if path in self._fh: - ret = True - else: - ret = False - - return ret + return path in self._fh def file_is_full(self): """Checks if the file is full. - + Checks if the file is full (i.e. the maximum number of slices have already been written), and returns the information to the user. - + Returns: - + status (bool): True if the file is full, False otherwise. """ @@ -569,7 +560,7 @@ class CXIWriter: def close_file(self): """Closes the file. - + Closes the file for writing, ending all writing operations. """ diff --git a/cfel_fabio.py b/cfel_fabio.py index 9785064..eac468b 100644 --- a/cfel_fabio.py +++ b/cfel_fabio.py @@ -19,13 +19,11 @@ This module contains utilities based on the fabio python module. files. """ -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function -from __future__ import unicode_literals +from __future__ import (absolute_import, division, print_function, + unicode_literals) -import numpy import fabio.cbfimage +import numpy def read_cbf_from_stream(stream): @@ -58,8 +56,8 @@ def read_cbf_from_stream(stream): print("%s: %s" % kv) raise RuntimeError(err) if cbf_obj.cif[cbf_obj.CIF_BINARY_BLOCK_KEY] == "CIF Binary Section": - cbf_obj.cbs += infile.read(len(cbf_obj.STARTER) + int(cbf_obj.header["X-Binary-Size"]) - - len(cbf_obj.cbs) + cbf_obj.start_binary) + cbf_obj.cbs += infile.read(len(cbf_obj.STARTER) + int(cbf_obj.header["X-Binary-Size"]) - + len(cbf_obj.cbs) + cbf_obj.start_binary) else: if len(cbf_obj.cif[cbf_obj.CIF_BINARY_BLOCK_KEY]) > int( cbf_obj.header["X-Binary-Size"]) + cbf_obj.start_binary + len(cbf_obj.STARTER): diff --git a/cfel_geom.py b/cfel_geom.py index 4048220..4a86482 100644 --- a/cfel_geom.py +++ b/cfel_geom.py @@ -19,12 +19,11 @@ This module contains utilities for the processing of CrystFEL-style geometry files. """ -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function -from __future__ import unicode_literals +from __future__ import (absolute_import, division, print_function, + unicode_literals) from collections import namedtuple + import numpy from cfelpyutils.cfel_crystfel import load_crystfel_geometry @@ -34,7 +33,6 @@ ImageShape = namedtuple('ImageShape', ['ss', 'fs']) def _find_minimum_image_shape(x, y): - # find the smallest size of cspad_geom that contains all # xy values but is symmetric about the origin n = 2 * int(max(abs(y.max()), abs(y.min()))) + 2 @@ -42,6 +40,7 @@ def _find_minimum_image_shape(x, y): return n, m + def apply_geometry_from_file(data_as_slab, geometry_filename): """Parses a geometry file and applies the geometry to data. @@ -61,7 +60,7 @@ def apply_geometry_from_file(data_as_slab, geometry_filename): detector, with the origin of the reference system at the beam interaction point. """ - x, y, slab_shape, img_shape = pixel_maps_for_image_view(geometry_filename) + x, y, _, img_shape = pixel_maps_for_image_view(geometry_filename) im_out = numpy.zeros(img_shape, dtype=data_as_slab.dtype) im_out[y, x] = data_as_slab.ravel() @@ -136,7 +135,7 @@ def pixel_maps_for_image_view(geometry_filename): def get_image_shape(geometry_filename): """Parses a geometry file and returns the minimum size of an image that can represent the detector. - + Parses the geometry file and return a numpy shape object representing the minimum size of an image that can contain the physical representation of the detector. The representation is centered at the point where the beam hits the detector according to the geometry in the file. @@ -160,8 +159,6 @@ def get_image_shape(geometry_filename): return img_shape - - def pixel_maps_from_geometry_file(fnam): """Parses a geometry file and creates pixel maps. @@ -189,17 +186,19 @@ def pixel_maps_from_geometry_file(fnam): for p in detector['panels']: # get the pixel coords for this asic - i, j = numpy.meshgrid(numpy.arange(detector['panels'][p]['max_ss'] - detector['panels'][p]['min_ss'] + 1), - numpy.arange(detector['panels'][p]['max_fs'] - detector['panels'][p]['min_fs'] + 1), - indexing='ij') + i, j = numpy.meshgrid( + numpy.arange(detector['panels'][p]['max_ss'] - detector['panels'][p]['min_ss'] + 1), + numpy.arange(detector['panels'][p]['max_fs'] - detector['panels'][p]['min_fs'] + 1), + indexing='ij' + ) # make the y-x ( ss, fs ) vectors, using complex notation dx = detector['panels'][p]['fsy'] + 1J * detector['panels'][p]['fsx'] dy = detector['panels'][p]['ssy'] + 1J * detector['panels'][p]['ssx'] r_0 = detector['panels'][p]['cny'] + 1J * detector['panels'][p]['cnx'] - # + r = i * dy + j * dx + r_0 - # + y[detector['panels'][p]['min_ss']: detector['panels'][p]['max_ss'] + 1, detector['panels'][p]['min_fs']: detector['panels'][p]['max_fs'] + 1] = r.real diff --git a/cfel_hdf5.py b/cfel_hdf5.py index e961a66..5daeb79 100644 --- a/cfel_hdf5.py +++ b/cfel_hdf5.py @@ -19,10 +19,8 @@ This module contains utilities for the processing of HDF5. This module builds on what the h5py module already provides. """ -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function -from __future__ import unicode_literals +from __future__ import (absolute_import, division, print_function, + unicode_literals) import h5py import numpy diff --git a/cfel_optarg.py b/cfel_optarg.py index 0521687..f85245f 100644 --- a/cfel_optarg.py +++ b/cfel_optarg.py @@ -19,10 +19,8 @@ This module contains utilities for parsing of command line options and configuration files. """ -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function -from __future__ import unicode_literals +from __future__ import (absolute_import, division, print_function, + unicode_literals) import ast diff --git a/cfel_psana.py b/cfel_psana.py index f17d8e9..736db61 100644 --- a/cfel_psana.py +++ b/cfel_psana.py @@ -12,19 +12,14 @@ # # You should have received a copy of the GNU General Public License # along with cfelpyutils. If not, see <http://www.gnu.org/licenses/>. - - """ Utilities based on the psana python module. This module provides utilities that build on the functionality provided by the psana python module. """ - -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function -from __future__ import unicode_literals +from __future__ import (absolute_import, division, print_function, + unicode_literals) def psana_obj_from_string(name): @@ -112,7 +107,7 @@ def dirname_from_source_runs(source): stop = len(source) runs = source[start:stop] nums = runs.split(',') - if len(nums) == 0: + if not nums: nums = runs dirname = 'run_' + '_'.join(nums) return dirname diff --git a/cfel_vtk.py b/cfel_vtk.py index f562d04..a2726e2 100644 --- a/cfel_vtk.py +++ b/cfel_vtk.py @@ -15,9 +15,13 @@ """ Utilities for 3d data visualization using the Visualization Toolkit (VTK). """ + + import numpy + import vtk + VTK_VERSION = vtk.vtkVersion().GetVTKMajorVersion() @@ -25,14 +29,20 @@ def get_lookup_table(minimum_value, maximum_value, log=False, colorscale="jet", """Create a vtkLookupTable with a specified range, and colorscale. Args: + minimum_value (float): Lowest value the lookup table can display, lower values will be displayed as this value + maximum_value (float): Highest value the lookup table can display, higher values will be displayed as this value + log (Optional[bool]): True if the scale is logarithmic + colorscale (Optional[string]): Accepts the name of any matplotlib colorscale. The lookuptable will replicate this scale. + number_of_colors (Optional[int]): The length of the table. Higher values corresponds to a smoother color scale. Returns: + lookup_table (vtk.vtkLookupTable): A vtk lookup table """ @@ -58,13 +68,17 @@ def array_to_float_array(array_in, dtype=None): This flattens the array and thus the shape is lost. Args: + array_in (numpy.ndarray): The array to convert. + dtype (Optional[type]): Optionaly convert the array to the specified data. Otherwise the original - type will be preserved. + type will be preserved. Returns: + float_array (vtk.vtkFloatArray): A float array of the specified type. """ + if dtype is None: dtype = array_in.dtype if dtype == "float32": @@ -87,13 +101,17 @@ def array_to_vtk(array_in, dtype=None): """Convert a numpy array into a vtk array of the specified type. This flattens the array and thus the shape is lost. Args: + array_in (numpy.ndarray): The array to convert. + dtype (Optional[type]): Optionaly convert the array to the specified data. Otherwise the original type - will be preserved. + will be preserved. Returns: + vtk_array (vtk.vtkFloatArray): A float array of the specified type. """ + if dtype is None: dtype = numpy.dtype(array_in.dtype) else: @@ -119,13 +137,17 @@ def array_to_image_data(array_in, dtype=None): """Convert a numpy array to vtkImageData. Image data is a 3D object, thus the input must be 3D. Args: + array_in (numpy.ndarray): Array to convert to vtkImageData. Must be 3D. + dtype (Optional[type]): Optionaly convert the array to the specified data. Otherwise the original - type will be preserved. + type will be preserved. Returns: + image_data (vtk.vtkImageData): Image data containing the data from the array. """ + if len(array_in.shape) != 3: raise ValueError("Array must be 3D for conversion to vtkImageData") array_flat = array_in.flatten() @@ -140,10 +162,14 @@ def window_to_png(render_window, file_name, magnification=1): """Take a screen shot of a specific vt render window and save it to file. Args: + render_window (vtk.vtkRenderWindow): The render window window to capture. + file_name (string): A png file with this name will be created from the provided window. + magnification (Optional[int]): Increase the resolution of the output file by this factor """ + magnification = int(magnification) window_to_image_filter = vtk.vtkWindowToImageFilter() window_to_image_filter.SetInput(render_window) @@ -162,12 +188,16 @@ def poly_data_to_actor(poly_data, lut): using a very basic vtkMapper Args: + poly_data (vtk.vtkPolyData): vtkPolyData object. + lut (vtk.vtkLookupTable): The vtkLookupTable specifies the colorscale to use for the maper. Returns: + actor (vtk.vtkActor): Actor to display the provided vtkPolyData """ + mapper = vtk.vtkPolyDataMapper() mapper.SetInputData(poly_data) mapper.SetLookupTable(lut) @@ -181,9 +211,12 @@ class IsoSurface(object): """Create and plot isosurfaces. Args: + volume (numpy.ndimage): 3D floating point array. + level (float or list of float): The threshold level for the isosurface, or a list of such levels. """ + def __init__(self, volume, level=None): self._surface_algorithm = None self._renderer = None @@ -216,8 +249,10 @@ class IsoSurface(object): """Create the numpy array self._volume_array and vtk array self._float_array and make them share data. Args: + volume (numpy.ndimage): This data will populate both the created numpy and vtk objects. """ + self._volume_array = numpy.zeros(volume.shape, dtype="float32", order="C") self._volume_array[:] = volume self._float_array.SetNumberOfValues(numpy.product(volume.shape)) @@ -229,8 +264,10 @@ class IsoSurface(object): """Set the renderer of the isosurface and remove any existing renderer. Args: + renderer (vtk.vtkRenderer): Give this renderer controll over all the surface actors. """ + if self._actor is None: raise RuntimeError("Actor does not exist.") if self._renderer is not None: @@ -242,8 +279,10 @@ class IsoSurface(object): """Remova any current surface levels and add the ones from the provided list. Args: + levels (list of float): Levels for the isosurface, in absolute values (not e.g. ratios) """ + self._surface_algorithm.SetNumberOfContours(0) for index, this_level in enumerate(levels): self._surface_algorithm.SetValue(index, this_level) @@ -253,8 +292,10 @@ class IsoSurface(object): """Return a list of the current surface levels. Returns: + levels (list of floats): The current surface levels. """ + return [self._surface_algorithm.GetValue(index) for index in range(self._surface_algorithm.GetNumberOfContours())] @@ -262,8 +303,10 @@ class IsoSurface(object): """Add a single surface level. Args: + level (float): The level of the new surface. """ + self._surface_algorithm.SetValue(self._surface_algorithm.GetNumberOfContours(), level) self._render() @@ -271,11 +314,13 @@ class IsoSurface(object): """Remove a singel surface level at the provided index. Args: + index (int): The index of the level. If levels were added one by one this corresponds - to the order in which they were added. + to the order in which they were added. """ - for index in range(index, self._surface_algorithm.GetNumberOfContours()-1): - self._surface_algorithm.SetValue(index, self._surface_algorithm.GetValue(index+1)) + + for idx in range(index, self._surface_algorithm.GetNumberOfContours()-1): + self._surface_algorithm.SetValue(idx, self._surface_algorithm.GetValue(idx+1)) self._surface_algorithm.SetNumberOfContours(self._surface_algorithm.GetNumberOfContours()-1) self._render() @@ -287,15 +332,19 @@ class IsoSurface(object): the order in which they were added. level (float): The new level of the surface. """ + self._surface_algorithm.SetValue(index, level) self._render() def set_cmap(self, cmap): - """Set the colormap. The color is a function of surface level and mainly of relevance when plotting multiple surfaces. + """Set the colormap. The color is a function of surface level and mainly of relevance when plotting multiple + surfaces. Args: + cmap (string): Name of the colormap to use. Supports all colormaps provided by matplotlib. """ + self._mapper.ScalarVisibilityOn() self._mapper.SetLookupTable(get_lookup_table(self._volume_array.min(), self._volume_array.max(), colorscale=cmap)) @@ -305,8 +354,10 @@ class IsoSurface(object): """Plot all surfaces in this provided color. Args: + color (length 3 iterable): The RGB value of the color. """ + self._mapper.ScalarVisibilityOff() self._actor.GetProperty().SetColor(color[0], color[1], color[2]) self._render() @@ -315,13 +366,16 @@ class IsoSurface(object): """Set the opacity of all surfaces. (seting it individually for each surface is not supported) Args: + opacity (float): Value between 0. and 1. where 0. is completely transparent and 1. is completely opaque. """ + self._actor.GetProperty().SetOpacity(opacity) self._render() def _render(self): """Render if a renderer is set, otherwise do nothing.""" + if self._renderer is not None: self._renderer.GetRenderWindow().Render() @@ -329,7 +383,9 @@ class IsoSurface(object): """Change the data displayed. Args: + volume (numpy.ndarray): The new array. Must have the same shape as the old array.""" + if volume.shape != self._volume_array.shape: raise ValueError("New volume must be the same shape as the old one") self._volume_array[:] = volume @@ -341,8 +397,11 @@ def plot_isosurface(volume, level=None, opacity=1.): """Plot isosurfaces of the provided module. Args: + volume (numpy.ndarray): The 3D numpy array that will be plotted. + level (float or list of floats): Levels can be iterable or singel value. + opacity (float): Float between 0. and 1. where 0. is completely transparent and 1. is completely opaque. """ @@ -371,10 +430,14 @@ def plot_planes(array_in, log=False, cmap=None): """Plot the volume at two interactive planes that cut the volume. Args: + array_in (numpy.ndarray): Input array must be 3D. + log (bool): If true the data will be plotted in logarithmic scale. + cmap (string): Name of the colormap to use. Supports all colormaps provided by matplotlib. """ + array_in = numpy.float64(array_in) renderer = vtk.vtkRenderer() render_window = vtk.vtkRenderWindow() @@ -429,14 +492,20 @@ def setup_window(size=(400, 400), background=(1., 1., 1.)): """Create a renderer, render_window and interactor and setup connections between them. Args: + size (Optional[length 2 iterable of int]): The size of the window in pixels. + background (Optional[length 3 iterable of float]): RGB value of the background color. Returns: + renderer (vtk.vtkRenderer): A standard renderer connected to the window. + render_window (vtk.vtkRenderWindow): With dimensions given in the arguments, or oterwise 400x400 pixels. + interactor (vtk.vtkRenderWindowInteractor): The interactor will be given the rubber band pick interactor style. """ + renderer = vtk.vtkRenderer() render_window = vtk.vtkRenderWindow() render_window.AddRenderer(renderer) @@ -452,24 +521,24 @@ def setup_window(size=(400, 400), background=(1., 1., 1.)): return renderer, render_window, interactor -def scatterplot_3d(data, color=None, point_size=None, cmap="jet", point_shape=None): +def scatterplot_3d(data, color=None, point_size=None, point_shape=None): """3D scatter plot. Args: + data (numpy.ndimage): The array must have shape Nx3 where N is the number of points. color (Optional[numpy.ndimage]): 1D Array of floating points with same length as the data array. - These numbers give the color of each point. - + These numbers give the color of each point. + point_size (Optional[float]): The size of each points. Behaves differently depending on the point_shape. - If shape is spheres the size is relative to the scene and if squares the size is relative to the window. - - cmap (Optional[str]): Color map - + If shape is spheres the size is relative to the scene and if squares the size is relative to the window. + point_shape (Optional["spheres" or "squares"]): "spheres" plots each point as a sphere, recommended for - small data sets. "squares" plot each point as a square without any 3D structure, recommended for - large data sets. + small data sets. "squares" plot each point as a square without any 3D structure, recommended for + large data sets. """ + if len(data.shape) != 2 or data.shape[1] != 3: raise ValueError("data must have shape (n, 3) where n is the number of points.") if point_shape is None: diff --git a/doc/build/doctrees/cfelpyutils.doctree b/doc/build/doctrees/cfelpyutils.doctree index a41051f8809eafee804847961801c5089599379d..5fce9a4c8fbd504c632809e2236a786e14a3748d 100644 GIT binary patch literal 157040 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 Y9D9AVe$8&o&<r{2(yt};>rGAkKc&A06951J literal 137275 zcmeHw378~Db*ARl^k`;ujgFB<N{tYzk-B?yf;2i{bip7Pgw6ph7u8kSU6oT^)zmT5 z4a*uIzz8Q^KrMUMupEY6Yz&xV{ef8<R)DyCEQZCf_S)XHu`tH6IgBrCy#IS~<q?^Y z+0``?w)B1KsmzFsc<;rF7cbs>@#2;1A6j?9niJ^1a9g8W9}ZgW{&c6?@cYZ*iS%OL z?+lh7T;B8J%dc3jgqwS{qy6r%SNE606HuexY_%Ibzq5S*a`S|6Q{S%-THTJW-`vpL z*xYpgas`DO2CYHcj}(Qc)o1<o!V>rCE!66VYjgfGRY&dhcl(Rfuf5W%mKhv0e`>gK zp#}g3%gvLAGqrG{HW>6;Gs6K8Ab{7k8hrp4ZmPFy{XSme_l8bwUi><-F<dYYGXSCI z&r+RXxM@(EqoU>Jw&u>}mgbt~x^SaH{l>k`?!3SE$b7BWs&!g>@9NGDjslFm5sdbN zdV9qO(bv<x{$M#=-)?pM<=fW|XPOg&w2D;C?dmz4xNA5w-)#)r0G7$JBlgM=;W9ut z4eXoe0OjT`5b%8be*yl#5dU8Ubeb148kZ6p%}R4m^OD;)L_Y{8`lhd%`aJPA(%5E2 z6Vq4{kxB#;FG81T`dzK}mihzy@C1SiKX*lg^#Q=}tSAx+>?GE=M6f<_I1_H~FEm@7 z#pzn3Avt|RtJCloBfKftHj|#=CU9J@#Y|KITeLcJVC`^sHkuWI=bq(IVmy^uce%Oo z;9$8%V|Fi4l+cGSF2Zv$+D<Pl?E@3`0cmH>>&|8qcNzS!2E2GexEZslHrJ~yG$Ygq zZ@LF^p)~-)-fXw$wK@a8*In>?wHbQ7<Q;7dn%<!4dpFat-gfJAy}q0gYF<yP5nhd^ z3=gzHpuoig&1Pl%)Ken`Dz@|te$L&^R$mUdSMPQPwN|I^_59ZSLfa?FS|f2uL&Jol z`7k@|ung^cwNAq$*~oO)^jpm)4IN(&@RthEvAGCNSr@_eK80(U8PlwXH@3UAhL!@= zIUn+L&|9kP@hYv3rkGhD;!*?C=(5cDGi`6$KCKQmFFA-IyC+<aC9fXgd9`regLM%l z)qV@h!C=^ntze$LtIBMv?bG71hq=Cj=1<~ANaE0%qSn*qhHz	%{<uRWU=j5u@@8 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 diff --git a/doc/build/doctrees/environment.pickle b/doc/build/doctrees/environment.pickle index 28a677e6662fda797590dfab93a4c446cbe70796..a4ed16141619c2a0bb75154cd86c47aadef2da2a 100644 GIT binary patch literal 13920 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 Kk>e;2)c+5Da2nSD literal 12789 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 Ao&W#< diff --git a/doc/build/doctrees/index.doctree b/doc/build/doctrees/index.doctree index 9db84027a9f779c6ec4bde99bfe5912fdacdd3ee..f5d0ebcaece3d183b097316574c19a550ef50061 100644 GIT binary patch delta 735 zcmeBC+pWgZz%tcfBg-l#85jMG{M=OivfRX?%*4D*{qX#vZ2h3r-29SMg~|Jvrb}st zr{*LBl_-?tD<r3-<`h(xmSpA>KWdmcIhR?1H-j;QIYZSiL*1`5DRFWmi{#{$%rRI* zXK?aN)@6CMS(Vk0QK&9MG@}MXCueDfN`@{_s&aAzTL$Cg$uHRyfFu{Y6p&P9muH+m z*_GXrbuLiFtjT<wmW-<=?`3xon318Hp_ZZUEesT&3UdU|Iu4M)M5urS$n1WgKo7)P zkPe`WGbT*V=FrqRoxvVEC1a*$<CNMd8X2q^5dJ(gzCaI0Zhp#S19lOS%Rpl@#6XHA zfEuM@fsB=t^SBhjj=KPIoW<Q9?xNJR)QW<f%;e0HDV-TR!P+zPQc^3XWbDp}%h=Na zaum$@B0$HTML1u8<s?C;-{rKCMmYLE*b@jx|DSBdB`eOt$iRTZu^hmV%whz}1Kn%E zl*KpsBA2l0&K|bn)Wo9X3~X)`1-kJs!i_u}Ac3Dy0dVwzgLrZttN7%6ZbjZMq^POf zJeRwQi7|Gw1YaYQL`RQsF)+!M6qW)LT5)_%esW??YVj1m&9ej~7|qKvinGjt4$CqD pxxR-pFEKZ@q_P0002Jh9eqc$z(hLa@w>U!!tS+N+^GiWxMgaN+`91&u delta 719 zcmdn3)}zMKz%rF_Bg-l#0So<%{M=OivfRX?%*4D*{mG}8rcX9x)|}kK%s+V{yUgT+ z%rRivikoM$Kg%n=9<HLq^5n#VlFa<PDSn$RSq&Lk>oY_%YC)<vOEXk5bb-98$@ADU z7^h5TXIHS9lEEH3C4-@dEi*4CGcR?@<SCksQ);JZWUyvHqy&06(o^#?^HNePrnF9h z$*}>ASui=7-I8@4kTn}<yd~r6$+y`ZcxPs)W~gPTdkX`_r@<W;z`?>e3B;2CIbs4( zt~Y}*gBhaMuQVxR;^a;a&5$!-*UW-D0m7e;#s@knH$MfNldhB|C1!|$oG$_Nl~gQ{ zv1)QPyCT??7eTHxz1PECl$w@WQIM0FoLMrZGh-K$X&HMm;xhJjfZPc4hX~NE=V1O| z1@TVd_s4He8+*79vKSZ{7{H!_djcUO(8E@onpl*aff}$`tdk44L>a*j=Kuz878B46 zpq&=xS^Pj2ru$*0U~#=D(7pelt`}hZ1!94d0XPOG7jRqfb|b}C)#k0-RZNU=n+^CH znHW1apA?W_G%wF6$+7_2n`H_lN_#l-5_3~aDhpDJ!O5iD4=m|dnjrxS_L2-Ou)2(@ J%@RV&i~z3<_dWms diff --git a/doc/build/doctrees/modules.doctree b/doc/build/doctrees/modules.doctree index b23b0f6f2f27d7ed87b7762d7b0684225843b8f9..80d31ec402191e61cafbd19f4dcc0483376048ab 100644 GIT binary patch delta 382 zcmZn@St`QXz%o^eYa;6ou?)rx<{q}<{L-T2)G2;FEIFBZKzicd1o;f<9yk4r{M=Oi zvfRX?%*4D*{qX#vZ2h3r-29SMg~{fOI!qZdld~B8#AIuyXk^I8PRURNVr3v!1!DEd z=NPBSmu6^Y7-mRkXl2NFvt&qR=$0lWW+2p0p2#Ft57!Yp1*BXXsEixrE{Hb2(xg<l zjvnshwA7q}%F>d|oZ=~oFbmOz!S+K;;{=+<j4;ic3Dp5Whe{&Z4-bkAEud32+cUps zWUSe&&uYZTsI@tX&6`o8qer+H7#<~srNB@qj?c+YPRvOyp5nK89lJQAOjt&6aSvx+ cVs2_lWdTsQc1lK=UvY*!kPhDbkVBOb05Xb%Hvj+t delta 366 zcmZ1~(k8;%z%unW=S0>W6E7!7^{^G^mlh?bPU*4I&&bbB)i29UEXqvG%haD7#HhpG z!;+JkmpWx~1EZgqbnO(44B6Nz8S+4^2*k=jtUCD#<Fxu7uA;>9<ivuK%>2A5ex(`e z8HO1e8JZbd-YgkX8M>uOi5bYcd-zN8lS_(HQ+3OW5(^4ai>4$Z42+!u(ytBF$DP5L z!3;6SuQVwYZbT1va$0ImL1k%4W==6st9%T^LFnRO_d$%~1RBSTFwUC^-ATyy!^0#) z6X=x9?#%BQ8EZG2vl=lnYHrSA^JZl1+<cZ@oKYq`Bc!;8GcPeWwWP8jwRlSHl#Fn{ O;tW|J9kPj2l@S1_(Shy& diff --git a/doc/build/html/.buildinfo b/doc/build/html/.buildinfo index 1e094d7..7be85be 100644 --- a/doc/build/html/.buildinfo +++ b/doc/build/html/.buildinfo @@ -1,4 +1,4 @@ # Sphinx build info version 1 # This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. -config: 2dd7d55b090045f2190c3a6867000ee1 +config: 588c1a44f724000c460bdf543d2999af tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/doc/build/html/_static/basic.css b/doc/build/html/_static/basic.css index 7ed0e58..6df76b0 100644 --- a/doc/build/html/_static/basic.css +++ b/doc/build/html/_static/basic.css @@ -4,7 +4,7 @@ * * Sphinx stylesheet -- basic theme. * - * :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2017 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ @@ -398,6 +398,13 @@ table.field-list td, table.field-list th { margin: 0; } +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + /* -- other body styles ----------------------------------------------------- */ ol.arabic { diff --git a/doc/build/html/_static/css3-mediaqueries.js b/doc/build/html/_static/css3-mediaqueries.js index 3b90652..59735f5 100644 --- a/doc/build/html/_static/css3-mediaqueries.js +++ b/doc/build/html/_static/css3-mediaqueries.js @@ -1 +1 @@ -if(typeof Object.create!=="function"){Object.create=function(e){function t(){}t.prototype=e;return new t}}var ua={toString:function(){return navigator.userAgent},test:function(e){return this.toString().toLowerCase().indexOf(e.toLowerCase())>-1}};ua.version=(ua.toString().toLowerCase().match(/[\s\S]+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[])[1];ua.webkit=ua.test("webkit");ua.gecko=ua.test("gecko")&&!ua.webkit;ua.opera=ua.test("opera");ua.ie=ua.test("msie")&&!ua.opera;ua.ie6=ua.ie&&document.compatMode&&typeof document.documentElement.style.maxHeight==="undefined";ua.ie7=ua.ie&&document.documentElement&&typeof document.documentElement.style.maxHeight!=="undefined"&&typeof XDomainRequest==="undefined";ua.ie8=ua.ie&&typeof XDomainRequest!=="undefined";var domReady=function(){var e=[];var t=function(){if(!arguments.callee.done){arguments.callee.done=true;for(var t=0;t<e.length;t++){e[t]()}}};if(document.addEventListener){document.addEventListener("DOMContentLoaded",t,false)}if(ua.ie){(function(){try{document.documentElement.doScroll("left")}catch(e){setTimeout(arguments.callee,50);return}t()})();document.onreadystatechange=function(){if(document.readyState==="complete"){document.onreadystatechange=null;t()}}}if(ua.webkit&&document.readyState){(function(){if(document.readyState!=="loading"){t()}else{setTimeout(arguments.callee,10)}})()}window.onload=t;return function(t){if(typeof t==="function"){e[e.length]=t}return t}}();var cssHelper=function(){var e={BLOCKS:/[^\s{;][^{;]*\{(?:[^{}]*\{[^{}]*\}[^{}]*|[^{}]*)*\}/g,BLOCKS_INSIDE:/[^\s{][^{]*\{[^{}]*\}/g,DECLARATIONS:/[a-zA-Z\-]+[^;]*:[^;]+;/g,RELATIVE_URLS:/url\(['"]?([^\/\)'"][^:\)'"]+)['"]?\)/g,REDUNDANT_COMPONENTS:/(?:\/\*([^*\\\\]|\*(?!\/))+\*\/|@import[^;]+;)/g,REDUNDANT_WHITESPACE:/\s*(,|:|;|\{|\})\s*/g,WHITESPACE_IN_PARENTHESES:/\(\s*(\S*)\s*\)/g,MORE_WHITESPACE:/\s{2,}/g,FINAL_SEMICOLONS:/;\}/g,NOT_WHITESPACE:/\S+/g};var t,n=false;var r=[];var s=function(e){if(typeof e==="function"){r[r.length]=e}};var o=function(){for(var e=0;e<r.length;e++){r[e](t)}};var u={};var a=function(e,t){if(u[e]){var n=u[e].listeners;if(n){for(var r=0;r<n.length;r++){n[r](t)}}}};var f=function(e,t,n){if(ua.ie&&!window.XMLHttpRequest){window.XMLHttpRequest=function(){return new ActiveXObject("Microsoft.XMLHTTP")}}if(!XMLHttpRequest){return""}var r=new XMLHttpRequest;try{r.open("get",e,true);r.setRequestHeader("X_REQUESTED_WITH","XMLHttpRequest")}catch(i){n();return}var s=false;setTimeout(function(){s=true},5e3);document.documentElement.style.cursor="progress";r.onreadystatechange=function(){if(r.readyState===4&&!s){if(!r.status&&location.protocol==="file:"||r.status>=200&&r.status<300||r.status===304||navigator.userAgent.indexOf("Safari")>-1&&typeof r.status==="undefined"){t(r.responseText)}else{n()}document.documentElement.style.cursor="";r=null}};r.send("")};var l=function(t){t=t.replace(e.REDUNDANT_COMPONENTS,"");t=t.replace(e.REDUNDANT_WHITESPACE,"$1");t=t.replace(e.WHITESPACE_IN_PARENTHESES,"($1)");t=t.replace(e.MORE_WHITESPACE," ");t=t.replace(e.FINAL_SEMICOLONS,"}");return t};var c={stylesheet:function(t){var n={};var r=[],i=[],s=[],o=[];var u=t.cssHelperText;var a=t.getAttribute("media");if(a){var f=a.toLowerCase().split(",")}else{var f=["all"]}for(var l=0;l<f.length;l++){r[r.length]=c.mediaQuery(f[l],n)}var h=u.match(e.BLOCKS);if(h!==null){for(var l=0;l<h.length;l++){if(h[l].substring(0,7)==="@media "){var p=c.mediaQueryList(h[l],n);s=s.concat(p.getRules());i[i.length]=p}else{s[s.length]=o[o.length]=c.rule(h[l],n,null)}}}n.element=t;n.getCssText=function(){return u};n.getAttrMediaQueries=function(){return r};n.getMediaQueryLists=function(){return i};n.getRules=function(){return s};n.getRulesWithoutMQ=function(){return o};return n},mediaQueryList:function(t,n){var r={};var i=t.indexOf("{");var s=t.substring(0,i);t=t.substring(i+1,t.length-1);var o=[],u=[];var a=s.toLowerCase().substring(7).split(",");for(var f=0;f<a.length;f++){o[o.length]=c.mediaQuery(a[f],r)}var l=t.match(e.BLOCKS_INSIDE);if(l!==null){for(f=0;f<l.length;f++){u[u.length]=c.rule(l[f],n,r)}}r.type="mediaQueryList";r.getMediaQueries=function(){return o};r.getRules=function(){return u};r.getListText=function(){return s};r.getCssText=function(){return t};return r},mediaQuery:function(t,n){t=t||"";var r,i;if(n.type==="mediaQueryList"){r=n}else{i=n}var s=false,o;var u=[];var a=true;var f=t.match(e.NOT_WHITESPACE);for(var l=0;l<f.length;l++){var c=f[l];if(!o&&(c==="not"||c==="only")){if(c==="not"){s=true}}else if(!o){o=c}else if(c.charAt(0)==="("){var h=c.substring(1,c.length-1).split(":");u[u.length]={mediaFeature:h[0],value:h[1]||null}}}return{getQueryText:function(){return t},getAttrStyleSheet:function(){return i||null},getList:function(){return r||null},getValid:function(){return a},getNot:function(){return s},getMediaType:function(){return o},getExpressions:function(){return u}}},rule:function(e,t,n){var r={};var i=e.indexOf("{");var s=e.substring(0,i);var o=s.split(",");var u=[];var a=e.substring(i+1,e.length-1).split(";");for(var f=0;f<a.length;f++){u[u.length]=c.declaration(a[f],r)}r.getStylesheet=function(){return t||null};r.getMediaQueryList=function(){return n||null};r.getSelectors=function(){return o};r.getSelectorText=function(){return s};r.getDeclarations=function(){return u};r.getPropertyValue=function(e){for(var t=0;t<u.length;t++){if(u[t].getProperty()===e){return u[t].getValue()}}return null};return r},declaration:function(e,t){var n=e.indexOf(":");var r=e.substring(0,n);var i=e.substring(n+1);return{getRule:function(){return t||null},getProperty:function(){return r},getValue:function(){return i}}}};var h=function(e){if(typeof e.cssHelperText!=="string"){return}var n={stylesheet:null,mediaQueryLists:[],rules:[],selectors:{},declarations:[],properties:{}};var r=n.stylesheet=c.stylesheet(e);var s=n.mediaQueryLists=r.getMediaQueryLists();var o=n.rules=r.getRules();var u=n.selectors;var a=function(e){var t=e.getSelectors();for(var n=0;n<t.length;n++){var r=t[n];if(!u[r]){u[r]=[]}u[r][u[r].length]=e}};for(i=0;i<o.length;i++){a(o[i])}var f=n.declarations;for(i=0;i<o.length;i++){f=n.declarations=f.concat(o[i].getDeclarations())}var l=n.properties;for(i=0;i<f.length;i++){var h=f[i].getProperty();if(!l[h]){l[h]=[]}l[h][l[h].length]=f[i]}e.cssHelperParsed=n;t[t.length]=e;return n};var p=function(e,t){return;e.cssHelperText=l(t||e.innerHTML);return h(e)};var d=function(){n=true;t=[];var r=[];var i=function(){for(var e=0;e<r.length;e++){h(r[e])}var t=document.getElementsByTagName("style");for(e=0;e<t.length;e++){p(t[e])}n=false;o()};var s=document.getElementsByTagName("link");for(var u=0;u<s.length;u++){var a=s[u];if(a.getAttribute("rel").indexOf("style")>-1&&a.href&&a.href.length!==0&&!a.disabled){r[r.length]=a}}if(r.length>0){var c=0;var d=function(){c++;if(c===r.length){i()}};var v=function(t){var n=t.href;f(n,function(r){r=l(r).replace(e.RELATIVE_URLS,"url("+n.substring(0,n.lastIndexOf("/"))+"/$1)");t.cssHelperText=r;d()},d)};for(u=0;u<r.length;u++){v(r[u])}}else{i()}};var v={stylesheets:"array",mediaQueryLists:"array",rules:"array",selectors:"object",declarations:"array",properties:"object"};var m={stylesheets:null,mediaQueryLists:null,rules:null,selectors:null,declarations:null,properties:null};var g=function(e,t){if(m[e]!==null){if(v[e]==="array"){return m[e]=m[e].concat(t)}else{var n=m[e];for(var r in t){if(t.hasOwnProperty(r)){if(!n[r]){n[r]=t[r]}else{n[r]=n[r].concat(t[r])}}}return n}}};var y=function(e){m[e]=v[e]==="array"?[]:{};for(var n=0;n<t.length;n++){var r=e==="stylesheets"?"stylesheet":e;g(e,t[n].cssHelperParsed[r])}return m[e]};var b=function(e){if(typeof window.innerWidth!="undefined"){return window["inner"+e]}else if(typeof document.documentElement!=="undefined"&&typeof document.documentElement.clientWidth!=="undefined"&&document.documentElement.clientWidth!=0){return document.documentElement["client"+e]}};return{addStyle:function(e,t,n){var r=document.createElement("style");r.setAttribute("type","text/css");if(t&&t.length>0){r.setAttribute("media",t.join(","))}document.getElementsByTagName("head")[0].appendChild(r);if(r.styleSheet){r.styleSheet.cssText=e}else{r.appendChild(document.createTextNode(e))}r.addedWithCssHelper=true;if(typeof n==="undefined"||n===true){cssHelper.parsed(function(t){var n=p(r,e);for(var i in n){if(n.hasOwnProperty(i)){g(i,n[i])}}a("newStyleParsed",r)})}else{r.parsingDisallowed=true}return r},removeStyle:function(e){return e.parentNode.removeChild(e)},parsed:function(e){if(n){s(e)}else{if(typeof t!=="undefined"){if(typeof e==="function"){e(t)}}else{s(e);d()}}},stylesheets:function(e){cssHelper.parsed(function(t){e(m.stylesheets||y("stylesheets"))})},mediaQueryLists:function(e){cssHelper.parsed(function(t){e(m.mediaQueryLists||y("mediaQueryLists"))})},rules:function(e){cssHelper.parsed(function(t){e(m.rules||y("rules"))})},selectors:function(e){cssHelper.parsed(function(t){e(m.selectors||y("selectors"))})},declarations:function(e){cssHelper.parsed(function(t){e(m.declarations||y("declarations"))})},properties:function(e){cssHelper.parsed(function(t){e(m.properties||y("properties"))})},broadcast:a,addListener:function(e,t){if(typeof t==="function"){if(!u[e]){u[e]={listeners:[]}}u[e].listeners[u[e].listeners.length]=t}},removeListener:function(e,t){if(typeof t==="function"&&u[e]){var n=u[e].listeners;for(var r=0;r<n.length;r++){if(n[r]===t){n.splice(r,1);r-=1}}}},getViewportWidth:function(){return b("Width")},getViewportHeight:function(){return b("Height")}}}();domReady(function(){var t;var n={LENGTH_UNIT:/[0-9]+(em|ex|px|in|cm|mm|pt|pc)$/,RESOLUTION_UNIT:/[0-9]+(dpi|dpcm)$/,ASPECT_RATIO:/^[0-9]+\/[0-9]+$/,ABSOLUTE_VALUE:/^[0-9]*(\.[0-9]+)*$/};var r=[];var i=function(){var e="css3-mediaqueries-test";var t=document.createElement("div");t.id=e;var n=cssHelper.addStyle("@media all and (width) { #"+e+" { width: 1px !important; } }",[],false);document.body.appendChild(t);var r=t.offsetWidth===1;n.parentNode.removeChild(n);t.parentNode.removeChild(t);i=function(){return r};return r};var s=function(){t=document.createElement("div");t.style.cssText="position:absolute;top:-9999em;left:-9999em;"+"margin:0;border:none;padding:0;width:1em;font-size:1em;";document.body.appendChild(t);if(t.offsetWidth!==16){t.style.fontSize=16/t.offsetWidth+"em"}t.style.width=""};var o=function(e){t.style.width=e;var n=t.offsetWidth;t.style.width="";return n};var u=function(e,t){var r=e.length;var i=e.substring(0,4)==="min-";var s=!i&&e.substring(0,4)==="max-";if(t!==null){var u;var a;if(n.LENGTH_UNIT.exec(t)){u="length";a=o(t)}else if(n.RESOLUTION_UNIT.exec(t)){u="resolution";a=parseInt(t,10);var f=t.substring((a+"").length)}else if(n.ASPECT_RATIO.exec(t)){u="aspect-ratio";a=t.split("/")}else if(n.ABSOLUTE_VALUE){u="absolute";a=t}else{u="unknown"}}var l,c;if("device-width"===e.substring(r-12,r)){l=screen.width;if(t!==null){if(u==="length"){return i&&l>=a||s&&l<a||!i&&!s&&l===a}else{return false}}else{return l>0}}else if("device-height"===e.substring(r-13,r)){c=screen.height;if(t!==null){if(u==="length"){return i&&c>=a||s&&c<a||!i&&!s&&c===a}else{return false}}else{return c>0}}else if("width"===e.substring(r-5,r)){l=document.documentElement.clientWidth||document.body.clientWidth;if(t!==null){if(u==="length"){return i&&l>=a||s&&l<a||!i&&!s&&l===a}else{return false}}else{return l>0}}else if("height"===e.substring(r-6,r)){c=document.documentElement.clientHeight||document.body.clientHeight;if(t!==null){if(u==="length"){return i&&c>=a||s&&c<a||!i&&!s&&c===a}else{return false}}else{return c>0}}else if("device-aspect-ratio"===e.substring(r-19,r)){return u==="aspect-ratio"&&screen.width*a[1]===screen.height*a[0]}else if("color-index"===e.substring(r-11,r)){var h=Math.pow(2,screen.colorDepth);if(t!==null){if(u==="absolute"){return i&&h>=a||s&&h<a||!i&&!s&&h===a}else{return false}}else{return h>0}}else if("color"===e.substring(r-5,r)){var p=screen.colorDepth;if(t!==null){if(u==="absolute"){return i&&p>=a||s&&p<a||!i&&!s&&p===a}else{return false}}else{return p>0}}else if("resolution"===e.substring(r-10,r)){var d;if(f==="dpcm"){d=o("1cm")}else{d=o("1in")}if(t!==null){if(u==="resolution"){return i&&d>=a||s&&d<a||!i&&!s&&d===a}else{return false}}else{return d>0}}else{return false}};var a=function(e){var t=e.getValid();var n=e.getExpressions();var r=n.length;if(r>0){for(var i=0;i<r&&t;i++){t=u(n[i].mediaFeature,n[i].value)}var s=e.getNot();return t&&!s||s&&!t}return t};var f=function(e,t){var n=e.getMediaQueries();var i={};for(var s=0;s<n.length;s++){var o=n[s].getMediaType();if(n[s].getExpressions().length===0){continue}var u=true;if(o!=="all"&&t&&t.length>0){u=false;for(var f=0;f<t.length;f++){if(t[f]===o){u=true}}}if(u&&a(n[s])){i[o]=true}}var l=[],c=0;for(var h in i){if(i.hasOwnProperty(h)){if(c>0){l[c++]=","}l[c++]=h}}if(l.length>0){r[r.length]=cssHelper.addStyle("@media "+l.join("")+"{"+e.getCssText()+"}",t,false)}};var l=function(e,t){for(var n=0;n<e.length;n++){f(e[n],t)}};var c=function(e){var t=e.getAttrMediaQueries();var n=false;var i={};for(var s=0;s<t.length;s++){if(a(t[s])){i[t[s].getMediaType()]=t[s].getExpressions().length>0}}var o=[],u=[];for(var f in i){if(i.hasOwnProperty(f)){o[o.length]=f;if(i[f]){u[u.length]=f}if(f==="all"){n=true}}}if(u.length>0){r[r.length]=cssHelper.addStyle(e.getCssText(),u,false)}var c=e.getMediaQueryLists();if(n){l(c)}else{l(c,o)}};var h=function(e){for(var t=0;t<e.length;t++){c(e[t])}if(ua.ie){document.documentElement.style.display="block";setTimeout(function(){document.documentElement.style.display=""},0);setTimeout(function(){cssHelper.broadcast("cssMediaQueriesTested")},100)}else{cssHelper.broadcast("cssMediaQueriesTested")}};var p=function(){for(var e=0;e<r.length;e++){cssHelper.removeStyle(r[e])}r=[];cssHelper.stylesheets(h)};var d=0;var v=function(){var e=cssHelper.getViewportWidth();var t=cssHelper.getViewportHeight();if(ua.ie){var n=document.createElement("div");n.style.position="absolute";n.style.top="-9999em";n.style.overflow="scroll";document.body.appendChild(n);d=n.offsetWidth-n.clientWidth;document.body.removeChild(n)}var r;var s=function(){var n=cssHelper.getViewportWidth();var s=cssHelper.getViewportHeight();if(Math.abs(n-e)>d||Math.abs(s-t)>d){e=n;t=s;clearTimeout(r);r=setTimeout(function(){if(!i()){p()}else{cssHelper.broadcast("cssMediaQueriesTested")}},500)}};window.onresize=function(){var e=window.onresize||function(){};return function(){e();s()}}()};var m=document.documentElement;m.style.marginLeft="-32767px";setTimeout(function(){m.style.marginLeft=""},5e3);return function(){if(!i()){cssHelper.addListener("newStyleParsed",function(e){c(e.cssHelperParsed.stylesheet)});cssHelper.addListener("cssMediaQueriesTested",function(){if(ua.ie){m.style.width="1px"}setTimeout(function(){m.style.width="";m.style.marginLeft=""},0);cssHelper.removeListener("cssMediaQueriesTested",arguments.callee)});s();p()}else{m.style.marginLeft=""}v()}}());try{document.execCommand("BackgroundImageCache",false,true)}catch(e){} \ No newline at end of file +if(typeof Object.create!=="function"){Object.create=function(e){function t(){}t.prototype=e;return new t}}var ua={toString:function(){return navigator.userAgent},test:function(e){return this.toString().toLowerCase().indexOf(e.toLowerCase())>-1}};ua.version=(ua.toString().toLowerCase().match(/[\s\S]+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[])[1];ua.webkit=ua.test("webkit");ua.gecko=ua.test("gecko")&&!ua.webkit;ua.opera=ua.test("opera");ua.ie=ua.test("msie")&&!ua.opera;ua.ie6=ua.ie&&document.compatMode&&typeof document.documentElement.style.maxHeight==="undefined";ua.ie7=ua.ie&&document.documentElement&&typeof document.documentElement.style.maxHeight!=="undefined"&&typeof XDomainRequest==="undefined";ua.ie8=ua.ie&&typeof XDomainRequest!=="undefined";var domReady=function(){var e=[];var t=function(){if(!arguments.callee.done){arguments.callee.done=true;for(var t=0;t<e.length;t++){e[t]()}}};if(document.addEventListener){document.addEventListener("DOMContentLoaded",t,false)}if(ua.ie){(function(){try{document.documentElement.doScroll("left")}catch(e){setTimeout(arguments.callee,50);return}t()})();document.onreadystatechange=function(){if(document.readyState==="complete"){document.onreadystatechange=null;t()}}}if(ua.webkit&&document.readyState){(function(){if(document.readyState!=="loading"){t()}else{setTimeout(arguments.callee,10)}})()}window.onload=t;return function(t){if(typeof t==="function"){e[e.length]=t}return t}}();var cssHelper=function(){var e={BLOCKS:/[^\s{;][^{;]*\{(?:[^{}]*\{[^{}]*\}[^{}]*|[^{}]*)*\}/g,BLOCKS_INSIDE:/[^\s{][^{]*\{[^{}]*\}/g,DECLARATIONS:/[a-zA-Z\-]+[^;]*:[^;]+;/g,RELATIVE_URLS:/url\(['"]?([^\/\)'"][^:\)'"]+)['"]?\)/g,REDUNDANT_COMPONENTS:/(?:\/\*([^*\\\\]|\*(?!\/))+\*\/|@import[^;]+;)/g,REDUNDANT_WHITESPACE:/\s*(,|:|;|\{|\})\s*/g,WHITESPACE_IN_PARENTHESES:/\(\s*(\S*)\s*\)/g,MORE_WHITESPACE:/\s{2,}/g,FINAL_SEMICOLONS:/;\}/g,NOT_WHITESPACE:/\S+/g};var t,n=false;var r=[];var s=function(e){if(typeof e==="function"){r[r.length]=e}};var o=function(){for(var e=0;e<r.length;e++){r[e](t)}};var u={};var a=function(e,t){if(u[e]){var n=u[e].listeners;if(n){for(var r=0;r<n.length;r++){n[r](t)}}}};var f=function(e,t,n){if(ua.ie&&!window.XMLHttpRequest){window.XMLHttpRequest=function(){return new ActiveXObject("Microsoft.XMLHTTP")}}if(!XMLHttpRequest){return""}var r=new XMLHttpRequest;try{r.open("get",e,true);r.setRequestHeader("X_REQUESTED_WITH","XMLHttpRequest")}catch(i){n();return}var s=false;setTimeout(function(){s=true},5e3);document.documentElement.style.cursor="progress";r.onreadystatechange=function(){if(r.readyState===4&&!s){if(!r.status&&location.protocol==="file:"||r.status>=200&&r.status<300||r.status===304||navigator.userAgent.indexOf("Safari")>-1&&typeof r.status==="undefined"){t(r.responseText)}else{n()}document.documentElement.style.cursor="";r=null}};r.send("")};var l=function(t){t=t.replace(e.REDUNDANT_COMPONENTS,"");t=t.replace(e.REDUNDANT_WHITESPACE,"$1");t=t.replace(e.WHITESPACE_IN_PARENTHESES,"($1)");t=t.replace(e.MORE_WHITESPACE," ");t=t.replace(e.FINAL_SEMICOLONS,"}");return t};var c={stylesheet:function(t){var n={};var r=[],i=[],s=[],o=[];var u=t.cssHelperText;var a=t.getAttribute("media");if(a){var f=a.toLowerCase().split(",")}else{var f=["all"]}for(var l=0;l<f.length;l++){r[r.length]=c.mediaQuery(f[l],n)}var h=u.match(e.BLOCKS);if(h!==null){for(var l=0;l<h.length;l++){if(h[l].substring(0,7)==="@media "){var p=c.mediaQueryList(h[l],n);s=s.concat(p.getRules());i[i.length]=p}else{s[s.length]=o[o.length]=c.rule(h[l],n,null)}}}n.element=t;n.getCssText=function(){return u};n.getAttrMediaQueries=function(){return r};n.getMediaQueryLists=function(){return i};n.getRules=function(){return s};n.getRulesWithoutMQ=function(){return o};return n},mediaQueryList:function(t,n){var r={};var i=t.indexOf("{");var s=t.substring(0,i);t=t.substring(i+1,t.length-1);var o=[],u=[];var a=s.toLowerCase().substring(7).split(",");for(var f=0;f<a.length;f++){o[o.length]=c.mediaQuery(a[f],r)}var l=t.match(e.BLOCKS_INSIDE);if(l!==null){for(f=0;f<l.length;f++){u[u.length]=c.rule(l[f],n,r)}}r.type="mediaQueryList";r.getMediaQueries=function(){return o};r.getRules=function(){return u};r.getListText=function(){return s};r.getCssText=function(){return t};return r},mediaQuery:function(t,n){t=t||"";var r,i;if(n.type==="mediaQueryList"){r=n}else{i=n}var s=false,o;var u=[];var a=true;var f=t.match(e.NOT_WHITESPACE);for(var l=0;l<f.length;l++){var c=f[l];if(!o&&(c==="not"||c==="only")){if(c==="not"){s=true}}else if(!o){o=c}else if(c.charAt(0)==="("){var h=c.substring(1,c.length-1).split(":");u[u.length]={mediaFeature:h[0],value:h[1]||null}}}return{getQueryText:function(){return t},getAttrStyleSheet:function(){return i||null},getList:function(){return r||null},getValid:function(){return a},getNot:function(){return s},getMediaType:function(){return o},getExpressions:function(){return u}}},rule:function(e,t,n){var r={};var i=e.indexOf("{");var s=e.substring(0,i);var o=s.split(",");var u=[];var a=e.substring(i+1,e.length-1).split(";");for(var f=0;f<a.length;f++){u[u.length]=c.declaration(a[f],r)}r.getStylesheet=function(){return t||null};r.getMediaQueryList=function(){return n||null};r.getSelectors=function(){return o};r.getSelectorText=function(){return s};r.getDeclarations=function(){return u};r.getPropertyValue=function(e){for(var t=0;t<u.length;t++){if(u[t].getProperty()===e){return u[t].getValue()}}return null};return r},declaration:function(e,t){var n=e.indexOf(":");var r=e.substring(0,n);var i=e.substring(n+1);return{getRule:function(){return t||null},getProperty:function(){return r},getValue:function(){return i}}}};var h=function(e){if(typeof e.cssHelperText!=="string"){return}var n={stylesheet:null,mediaQueryLists:[],rules:[],selectors:{},declarations:[],properties:{}};var r=n.stylesheet=c.stylesheet(e);var s=n.mediaQueryLists=r.getMediaQueryLists();var o=n.rules=r.getRules();var u=n.selectors;var a=function(e){var t=e.getSelectors();for(var n=0;n<t.length;n++){var r=t[n];if(!u[r]){u[r]=[]}u[r][u[r].length]=e}};for(i=0;i<o.length;i++){a(o[i])}var f=n.declarations;for(i=0;i<o.length;i++){f=n.declarations=f.concat(o[i].getDeclarations())}var l=n.properties;for(i=0;i<f.length;i++){var h=f[i].getProperty();if(!l[h]){l[h]=[]}l[h][l[h].length]=f[i]}e.cssHelperParsed=n;t[t.length]=e;return n};var p=function(e,t){return;e.cssHelperText=l(t||e.innerHTML);return h(e)};var d=function(){n=true;t=[];var r=[];var i=function(){for(var e=0;e<r.length;e++){h(r[e])}var t=document.getElementsByTagName("style");for(e=0;e<t.length;e++){p(t[e])}n=false;o()};var s=document.getElementsByTagName("link");for(var u=0;u<s.length;u++){var a=s[u];if(a.getAttribute("rel").indexOf("style")>-1&&a.href&&a.href.length!==0&&!a.disabled){r[r.length]=a}}if(r.length>0){var c=0;var d=function(){c++;if(c===r.length){i()}};var v=function(t){var n=t.href;f(n,function(r){r=l(r).replace(e.RELATIVE_URLS,"url("+n.substring(0,n.lastIndexOf("/"))+"/$1)");t.cssHelperText=r;d()},d)};for(u=0;u<r.length;u++){v(r[u])}}else{i()}};var v={stylesheets:"array",mediaQueryLists:"array",rules:"array",selectors:"object",declarations:"array",properties:"object"};var m={stylesheets:null,mediaQueryLists:null,rules:null,selectors:null,declarations:null,properties:null};var g=function(e,t){if(m[e]!==null){if(v[e]==="array"){return m[e]=m[e].concat(t)}else{var n=m[e];for(var r in t){if(t.hasOwnProperty(r)){if(!n[r]){n[r]=t[r]}else{n[r]=n[r].concat(t[r])}}}return n}}};var y=function(e){m[e]=v[e]==="array"?[]:{};for(var n=0;n<t.length;n++){var r=e==="stylesheets"?"stylesheet":e;g(e,t[n].cssHelperParsed[r])}return m[e]};var b=function(e){if(typeof window.innerWidth!="undefined"){return window["inner"+e]}else if(typeof document.documentElement!=="undefined"&&typeof document.documentElement.clientWidth!=="undefined"&&document.documentElement.clientWidth!=0){return document.documentElement["client"+e]}};return{addStyle:function(e,t,n){var r=document.createElement("style");r.setAttribute("type","text/css");if(t&&t.length>0){r.setAttribute("media",t.join(","))}document.getElementsByTagName("head")[0].appendChild(r);if(r.styleSheet){r.styleSheet.cssText=e}else{r.appendChild(document.createTextNode(e))}r.addedWithCssHelper=true;if(typeof n==="undefined"||n===true){cssHelper.parsed(function(t){var n=p(r,e);for(var i in n){if(n.hasOwnProperty(i)){g(i,n[i])}}a("newStyleParsed",r)})}else{r.parsingDisallowed=true}return r},removeStyle:function(e){return e.parentNode.removeChild(e)},parsed:function(e){if(n){s(e)}else{if(typeof t!=="undefined"){if(typeof e==="function"){e(t)}}else{s(e);d()}}},stylesheets:function(e){cssHelper.parsed(function(t){e(m.stylesheets||y("stylesheets"))})},mediaQueryLists:function(e){cssHelper.parsed(function(t){e(m.mediaQueryLists||y("mediaQueryLists"))})},rules:function(e){cssHelper.parsed(function(t){e(m.rules||y("rules"))})},selectors:function(e){cssHelper.parsed(function(t){e(m.selectors||y("selectors"))})},declarations:function(e){cssHelper.parsed(function(t){e(m.declarations||y("declarations"))})},properties:function(e){cssHelper.parsed(function(t){e(m.properties||y("properties"))})},broadcast:a,addListener:function(e,t){if(typeof t==="function"){if(!u[e]){u[e]={listeners:[]}}u[e].listeners[u[e].listeners.length]=t}},removeListener:function(e,t){if(typeof t==="function"&&u[e]){var n=u[e].listeners;for(var r=0;r<n.length;r++){if(n[r]===t){n.splice(r,1);r-=1}}}},getViewportWidth:function(){return b("Width")},getViewportHeight:function(){return b("Height")}}}();domReady(function(){var t;var n={LENGTH_UNIT:/[0-9]+(em|ex|px|in|cm|mm|pt|pc)$/,RESOLUTION_UNIT:/[0-9]+(dpi|dpcm)$/,ASPECT_RATIO:/^[0-9]+\/[0-9]+$/,ABSOLUTE_VALUE:/^[0-9]*(\.[0-9]+)*$/};var r=[];var i=function(){var e="css3-mediaqueries-test";var t=document.createElement("div");t.id=e;var n=cssHelper.addStyle("@media all and (width) { #"+e+" { width: 1px !important; } }",[],false);document.body.appendChild(t);var r=t.offsetWidth===1;n.parentNode.removeChild(n);t.parentNode.removeChild(t);i=function(){return r};return r};var s=function(){t=document.createElement("div");t.style.cssText="position:absolute;top:-9999em;left:-9999em;"+"margin:0;border:none;padding:0;width:1em;font-size:1em;";document.body.appendChild(t);if(t.offsetWidth!==16){t.style.fontSize=16/t.offsetWidth+"em"}t.style.width=""};var o=function(e){t.style.width=e;var n=t.offsetWidth;t.style.width="";return n};var u=function(e,t){var r=e.length;var i=e.substring(0,4)==="min-";var s=!i&&e.substring(0,4)==="max-";if(t!==null){var u;var a;if(n.LENGTH_UNIT.exec(t)){u="length";a=o(t)}else if(n.RESOLUTION_UNIT.exec(t)){u="resolution";a=parseInt(t,10);var f=t.substring((a+"").length)}else if(n.ASPECT_RATIO.exec(t)){u="aspect-ratio";a=t.split("/")}else if(n.ABSOLUTE_VALUE){u="absolute";a=t}else{u="unknown"}}var l,c;if("device-width"===e.substring(r-12,r)){l=screen.width;if(t!==null){if(u==="length"){return i&&l>=a||s&&l<a||!i&&!s&&l===a}else{return false}}else{return l>0}}else if("device-height"===e.substring(r-13,r)){c=screen.height;if(t!==null){if(u==="length"){return i&&c>=a||s&&c<a||!i&&!s&&c===a}else{return false}}else{return c>0}}else if("width"===e.substring(r-5,r)){l=document.documentElement.clientWidth||document.body.clientWidth;if(t!==null){if(u==="length"){return i&&l>=a||s&&l<a||!i&&!s&&l===a}else{return false}}else{return l>0}}else if("height"===e.substring(r-6,r)){c=document.documentElement.clientHeight||document.body.clientHeight;if(t!==null){if(u==="length"){return i&&c>=a||s&&c<a||!i&&!s&&c===a}else{return false}}else{return c>0}}else if("device-aspect-ratio"===e.substring(r-19,r)){return u==="aspect-ratio"&&screen.width*a[1]===screen.height*a[0]}else if("color-index"===e.substring(r-11,r)){var h=Math.pow(2,screen.colorDepth);if(t!==null){if(u==="absolute"){return i&&h>=a||s&&h<a||!i&&!s&&h===a}else{return false}}else{return h>0}}else if("color"===e.substring(r-5,r)){var p=screen.colorDepth;if(t!==null){if(u==="absolute"){return i&&p>=a||s&&p<a||!i&&!s&&p===a}else{return false}}else{return p>0}}else if("resolution"===e.substring(r-10,r)){var d;if(f==="dpcm"){d=o("1cm")}else{d=o("1in")}if(t!==null){if(u==="resolution"){return i&&d>=a||s&&d<a||!i&&!s&&d===a}else{return false}}else{return d>0}}else{return false}};var a=function(e){var t=e.getValid();var n=e.getExpressions();var r=n.length;if(r>0){for(var i=0;i<r&&t;i++){t=u(n[i].mediaFeature,n[i].value)}var s=e.getNot();return t&&!s||s&&!t}return t};var f=function(e,t){var n=e.getMediaQueries();var i={};for(var s=0;s<n.length;s++){var o=n[s].getMediaType();if(n[s].getExpressions().length===0){continue}var u=true;if(o!=="all"&&t&&t.length>0){u=false;for(var f=0;f<t.length;f++){if(t[f]===o){u=true}}}if(u&&a(n[s])){i[o]=true}}var l=[],c=0;for(var h in i){if(i.hasOwnProperty(h)){if(c>0){l[c++]=","}l[c++]=h}}if(l.length>0){r[r.length]=cssHelper.addStyle("@media "+l.join("")+"{"+e.getCssText()+"}",t,false)}};var l=function(e,t){for(var n=0;n<e.length;n++){f(e[n],t)}};var c=function(e){var t=e.getAttrMediaQueries();var n=false;var i={};for(var s=0;s<t.length;s++){if(a(t[s])){i[t[s].getMediaType()]=t[s].getExpressions().length>0}}var o=[],u=[];for(var f in i){if(i.hasOwnProperty(f)){o[o.length]=f;if(i[f]){u[u.length]=f}if(f==="all"){n=true}}}if(u.length>0){r[r.length]=cssHelper.addStyle(e.getCssText(),u,false)}var c=e.getMediaQueryLists();if(n){l(c)}else{l(c,o)}};var h=function(e){for(var t=0;t<e.length;t++){c(e[t])}if(ua.ie){document.documentElement.style.display="block";setTimeout(function(){document.documentElement.style.display=""},0);setTimeout(function(){cssHelper.broadcast("cssMediaQueriesTested")},100)}else{cssHelper.broadcast("cssMediaQueriesTested")}};var p=function(){for(var e=0;e<r.length;e++){cssHelper.removeStyle(r[e])}r=[];cssHelper.stylesheets(h)};var d=0;var v=function(){var e=cssHelper.getViewportWidth();var t=cssHelper.getViewportHeight();if(ua.ie){var n=document.createElement("div");n.style.position="absolute";n.style.top="-9999em";n.style.overflow="scroll";document.body.appendChild(n);d=n.offsetWidth-n.clientWidth;document.body.removeChild(n)}var r;var s=function(){var n=cssHelper.getViewportWidth();var s=cssHelper.getViewportHeight();if(Math.abs(n-e)>d||Math.abs(s-t)>d){e=n;t=s;clearTimeout(r);r=setTimeout(function(){if(!i()){p()}else{cssHelper.broadcast("cssMediaQueriesTested")}},500)}};window.onresize=function(){var e=window.onresize||function(){};return function(){e();s()}}()};var m=document.documentElement;m.style.marginLeft="-32767px";setTimeout(function(){m.style.marginLeft=""},5e3);return function(){if(!i()){cssHelper.addListener("newStyleParsed",function(e){c(e.cssHelperParsed.stylesheet)});cssHelper.addListener("cssMediaQueriesTested",function(){if(ua.ie){m.style.width="1px"}setTimeout(function(){m.style.width="";m.style.marginLeft=""},0);cssHelper.removeListener("cssMediaQueriesTested",arguments.callee)});s();p()}else{m.style.marginLeft=""}v()}}());try{document.execCommand("BackgroundImageCache",false,true)}catch(e){} diff --git a/doc/build/html/_static/doctools.js b/doc/build/html/_static/doctools.js index 8163495..5654977 100644 --- a/doc/build/html/_static/doctools.js +++ b/doc/build/html/_static/doctools.js @@ -4,7 +4,7 @@ * * Sphinx JavaScript utilities for all documentation. * - * :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2017 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ diff --git a/doc/build/html/_static/pygments.css b/doc/build/html/_static/pygments.css index 8213e90..20c4814 100644 --- a/doc/build/html/_static/pygments.css +++ b/doc/build/html/_static/pygments.css @@ -47,8 +47,10 @@ .highlight .mh { color: #208050 } /* Literal.Number.Hex */ .highlight .mi { color: #208050 } /* Literal.Number.Integer */ .highlight .mo { color: #208050 } /* Literal.Number.Oct */ +.highlight .sa { color: #4070a0 } /* Literal.String.Affix */ .highlight .sb { color: #4070a0 } /* Literal.String.Backtick */ .highlight .sc { color: #4070a0 } /* Literal.String.Char */ +.highlight .dl { color: #4070a0 } /* Literal.String.Delimiter */ .highlight .sd { color: #4070a0; font-style: italic } /* Literal.String.Doc */ .highlight .s2 { color: #4070a0 } /* Literal.String.Double */ .highlight .se { color: #4070a0; font-weight: bold } /* Literal.String.Escape */ @@ -59,7 +61,9 @@ .highlight .s1 { color: #4070a0 } /* Literal.String.Single */ .highlight .ss { color: #517918 } /* Literal.String.Symbol */ .highlight .bp { color: #007020 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #06287e } /* Name.Function.Magic */ .highlight .vc { color: #bb60d5 } /* Name.Variable.Class */ .highlight .vg { color: #bb60d5 } /* Name.Variable.Global */ .highlight .vi { color: #bb60d5 } /* Name.Variable.Instance */ +.highlight .vm { color: #bb60d5 } /* Name.Variable.Magic */ .highlight .il { color: #208050 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/doc/build/html/_static/searchtools.js b/doc/build/html/_static/searchtools.js index bbfb3ac..c821573 100644 --- a/doc/build/html/_static/searchtools.js +++ b/doc/build/html/_static/searchtools.js @@ -4,7 +4,7 @@ * * Sphinx JavaScript utilities for the full-text search. * - * :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2017 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ diff --git a/doc/build/html/_static/websupport.js b/doc/build/html/_static/websupport.js index 98e7f40..53f6a45 100644 --- a/doc/build/html/_static/websupport.js +++ b/doc/build/html/_static/websupport.js @@ -4,7 +4,7 @@ * * sphinx.websupport utilities for all documentation. * - * :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2017 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ diff --git a/doc/build/html/cfelpyutils.html b/doc/build/html/cfelpyutils.html index 7d2a7f3..1845ab9 100644 --- a/doc/build/html/cfelpyutils.html +++ b/doc/build/html/cfelpyutils.html @@ -2,16 +2,12 @@ <!doctype html> - <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> - <title>cfelpyutils package — cfelpyutils 0.5 documentation</title> - <link rel="stylesheet" href="_static/bizstyle.css" type="text/css" /> <link rel="stylesheet" href="_static/pygments.css" type="text/css" /> - <script type="text/javascript"> var DOCUMENTATION_OPTIONS = { URL_ROOT: './', @@ -33,7 +29,7 @@ <script type="text/javascript" src="_static/css3-mediaqueries.js"></script> <![endif]--> </head> - <body role="document"> + <body> <div class="related" role="navigation" aria-label="related navigation"> <h3>Navigation</h3> <ul> @@ -110,7 +106,7 @@ documentation on the CrystFEL geometry format, see:</p> <col class="field-name" /> <col class="field-body" /> <tbody valign="top"> -<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>filename</strong> (<em>str</em>) – filename of the geometry file</td> +<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>filename</strong> (<em>str</em>) – filename of the geometry file</td> </tr> <tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body">dictionary with the geometry loaded from the file</td> </tr> @@ -132,13 +128,13 @@ documentation on the CrystFEL geometry format, see:</p> <dd><p>Bases: <code class="xref py py-class docutils literal"><span class="pre">object</span></code></p> <p>Writing of multi-event CXIDB files.</p> <p>Implements a simple low-level CXIDB file format writer for multi event files. it allows the user to write data -“stacks” in the CXIDB files, making sure that the entries in all stacks are synchronized.</p> +“stacks†in the CXIDB files, making sure that the entries in all stacks are synchronized.</p> <p>A CXI Writer instance manages one file. A user can add a stack to a CXI Writer instance with the add_stack_to_writer function, which also writes the first entry in the stack. The user can then add to the writer all the stacks that he wants in the file. Once all stacks are added, the user initializes them with the initialize_stacks function. After initialization, no more stacks can be added. Instead, entries can be appended to the existing stacks, using the append_data_to_stack function.</p> -<p>A “slice” (a set of synced entries in all the stacks in the file) can be written to the a file only after an entry +<p>A “slice†(a set of synced entries in all the stacks in the file) can be written to the a file only after an entry has been appended to all stacks in the file. Conversely, after an entry has been appended to a stack, the user cannot append another entry before a slice is written. This ensures synchronization of the data in all the stacks.</p> <p>A file can be closed at any time. In any case, the writer will not allow a file to contain more than the @@ -149,32 +145,32 @@ is set to True.</p> <p>Example of usage of the stack API:</p> <p>c1 = 0 c2 = 0</p> -<p>f1 = CXIWriter(‘test1.h5’, ) -f2 = CXIWriter(‘test2.h5’, )</p> +<p>f1 = CXIWriter(‘test1.h5’, ) +f2 = CXIWriter(‘test2.h5’, )</p> <dl class="docutils"> -<dt>f1.add_stack_to_writer(‘detector1’, ‘/entry_1/detector_1/data’, numpy.random.rand(2, 2),</dt> -<dd>‘frame:y:x’)</dd> -<dt>f2.add_stack_to_writer(‘detector2’, ‘/entry_1/detector_1/data’, numpy.random.rand(3, 2),</dt> -<dd>‘frame:y:x’, compression=False, chunk_size=(1,3,2))</dd> +<dt>f1.add_stack_to_writer(‘detector1’, ‘/entry_1/detector_1/data’, numpy.random.rand(2, 2),</dt> +<dd>‘frame:y:x’)</dd> +<dt>f2.add_stack_to_writer(‘detector2’, ‘/entry_1/detector_1/data’, numpy.random.rand(3, 2),</dt> +<dd>‘frame:y:x’, compression=False, chunk_size=(1,3,2))</dd> </dl> -<p>f1.add_stack_to_writer(‘counter1’, ‘/entry_1/detector_1/count’, c1) -f2.add_stack_to_writer(‘counter2’, ‘/entry_1/detector_1/count’, c2)</p> -<p>f1.write_simple_entry(‘detectorname1’, ‘/entry_1/detector_1/name’, ‘FrontCSPAD’) -f2.write_simple_entry(‘detectorname2’, ‘/entry_1/detector_1/name’, ‘BackCSPAD’)</p> +<p>f1.add_stack_to_writer(‘counter1’, ‘/entry_1/detector_1/count’, c1) +f2.add_stack_to_writer(‘counter2’, ‘/entry_1/detector_1/count’, c2)</p> +<p>f1.write_simple_entry(‘detectorname1’, ‘/entry_1/detector_1/name’, ‘FrontCSPAD’) +f2.write_simple_entry(‘detectorname2’, ‘/entry_1/detector_1/name’, ‘BackCSPAD’)</p> <p>f1.initialize_stacks() f2.initialize_stacks()</p> <p>a = numpy.random.rand(2, 2) b = numpy.random.rand(3, 2)</p> <p>c1 += 1 c2 += 2</p> -<p>f1.append_data_to_stack(‘detector1’, a) -f2.append_data_to_stack(‘detector2’, b)</p> -<p>f1.append_data_to_stack(‘counter1’, c1) -f2.append_data_to_stack(‘counter2’, c2)</p> +<p>f1.append_data_to_stack(‘detector1’, a) +f2.append_data_to_stack(‘detector2’, b)</p> +<p>f1.append_data_to_stack(‘counter1’, c1) +f2.append_data_to_stack(‘counter2’, c2)</p> <p>f1.write_stack_slice_and_increment() f2.write_stack_slice_and_increment()</p> -<p>f1.create_link(‘detectorname1’, ‘/name’) -f2.create_link(‘detectorname2’, ‘/name’)</p> +<p>f1.create_link(‘detectorname1’, ‘/name’) +f2.create_link(‘detectorname2’, ‘/name’)</p> <p>f1.close_file() f2.close_file()</p> <dl class="method"> @@ -191,18 +187,18 @@ the stack.</p> <col class="field-body" /> <tbody valign="top"> <tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first last simple"> -<li><strong>name</strong> (<em>str</em>) – stack name.</li> -<li><strong>path</strong> (<em>str</em>) – path in the hdf5 file where the stack will be written.</li> -<li><strong></strong><strong>(</strong><strong>Union</strong><strong>[</strong><strong>numpy.ndarray</strong><strong>, </strong><strong>bytes</strong><strong>, </strong><strong>int</strong><strong>, </strong><strong>float</strong><strong>]</strong><strong></strong> (<em>initial_data</em>) – initial entry in the stack. It gets written to the</li> -<li><strong>as slice 0. Its characteristics are used to validate all data subsequently appended to the stack.</strong> (<em>stack</em>) – </li> -<li><strong>axes</strong> (<em>bytes</em>) – the ‘axes’ attribute for the stack, as defined by the CXIDB file format.</li> -<li><strong>compression</strong> (<em>Union</em><em>[</em><em>None</em><em>, </em><em>bool</em><em>,</em><em>str</em><em>]</em><em></em>) – compression parameter for the stack. This parameters works in the same</li> -<li><strong>as the normal compression parameter from h5py. The default value of this parameter is True.</strong> (<em>way</em>) – </li> -<li><strong>chunk_size</strong> (<em>Union</em><em>[</em><em>None</em><em>, </em><em>tuple</em><em>]</em><em></em>) – HDF5 chuck size for the stack. If this parameter is set to None, the</li> -<li><strong>writer will compute a chuck size automatically</strong> (<em>CXI</em>) – </li> -<li><strong>use the provided tuple to set the chunk size.</strong> (<em>will</em>) – </li> -<li><strong>overwrite</strong> (<em>bool</em>) – if set to True, a stack already existing at the same location will be overwritten. If set</li> -<li><strong>False</strong><strong>, </strong><strong>an attempt to overwrite a stack will raise an error.</strong> (<em>to</em>) – </li> +<li><strong>name</strong> (<em>str</em>) – stack name.</li> +<li><strong>path</strong> (<em>str</em>) – path in the hdf5 file where the stack will be written.</li> +<li><strong>(</strong><strong>Union</strong><strong>[</strong><strong>numpy.ndarray</strong><strong>, </strong><strong>bytes</strong><strong>, </strong><strong>int</strong><strong>, </strong><strong>float</strong><strong>]</strong> (<em>initial_data</em>) – initial entry in the stack. It gets written to the</li> +<li><strong>as slice 0. Its characteristics are used to validate all data subsequently appended to the stack.</strong> (<em>stack</em>) – </li> +<li><strong>axes</strong> (<em>bytes</em>) – the ‘axes’ attribute for the stack, as defined by the CXIDB file format.</li> +<li><strong>compression</strong> (<em>Union</em><em>[</em><em>None</em><em>, </em><em>bool</em><em>,</em><em>str</em><em>]</em>) – compression parameter for the stack. This parameters works in the same</li> +<li><strong>as the normal compression parameter from h5py. The default value of this parameter is True.</strong> (<em>way</em>) – </li> +<li><strong>chunk_size</strong> (<em>Union</em><em>[</em><em>None</em><em>, </em><em>tuple</em><em>]</em>) – HDF5 chuck size for the stack. If this parameter is set to None, the</li> +<li><strong>writer will compute a chuck size automatically</strong> (<em>CXI</em>) – </li> +<li><strong>use the provided tuple to set the chunk size.</strong> (<em>will</em>) – </li> +<li><strong>overwrite</strong> (<em>bool</em>) – if set to True, a stack already existing at the same location will be overwritten. If set</li> +<li><strong>False</strong><strong>, </strong><strong>an attempt to overwrite a stack will raise an error.</strong> (<em>to</em>) – </li> </ul> </td> </tr> @@ -222,9 +218,9 @@ the write_slice_and_increment.</p> <col class="field-body" /> <tbody valign="top"> <tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first last simple"> -<li><strong>name</strong> (<em>str</em>) – stack name, defining the stack to which the data will be appended.</li> -<li><strong></strong><strong>(</strong><strong>Union</strong><strong>[</strong><strong>numpy.ndarray</strong><strong>, </strong><strong>bytes</strong><strong>, </strong><strong>int</strong><strong>, </strong><strong>float</strong><strong>]</strong><strong></strong> (<em>data</em>) – data to write. The data will be validated against the type</li> -<li><strong>size of previous entries in the stack.</strong> (<em>and</em>) – </li> +<li><strong>name</strong> (<em>str</em>) – stack name, defining the stack to which the data will be appended.</li> +<li><strong>(</strong><strong>Union</strong><strong>[</strong><strong>numpy.ndarray</strong><strong>, </strong><strong>bytes</strong><strong>, </strong><strong>int</strong><strong>, </strong><strong>float</strong><strong>]</strong> (<em>data</em>) – data to write. The data will be validated against the type</li> +<li><strong>size of previous entries in the stack.</strong> (<em>and</em>) – </li> </ul> </td> </tr> @@ -251,10 +247,10 @@ value of the overwrite parameter is True.</p> <col class="field-body" /> <tbody valign="top"> <tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first last simple"> -<li><strong>name</strong> (<em>str</em>) – name of the stack or entry to which the link points.</li> -<li><strong>path</strong> (<em>str</em>) – path in the hdf5 where the link is created.</li> -<li><strong>overwrite</strong> (<em>bool</em>) – if set to True, an entry already existing at the same location will be overwritten. If set</li> -<li><strong>False</strong><strong>, </strong><strong>an attempt to overwrite an entry will raise an error.</strong> (<em>to</em>) – </li> +<li><strong>name</strong> (<em>str</em>) – name of the stack or entry to which the link points.</li> +<li><strong>path</strong> (<em>str</em>) – path in the hdf5 where the link is created.</li> +<li><strong>overwrite</strong> (<em>bool</em>) – if set to True, an entry already existing at the same location will be overwritten. If set</li> +<li><strong>False</strong><strong>, </strong><strong>an attempt to overwrite an entry will raise an error.</strong> (<em>to</em>) – </li> </ul> </td> </tr> @@ -273,10 +269,10 @@ the specified path, it is deleted and replaced only if the value of the overwrit <col class="field-body" /> <tbody valign="top"> <tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first last simple"> -<li><strong>group</strong> (<em>str</em>) – internal HDF5 path of the group to which the link points.</li> -<li><strong>path</strong> (<em>str</em>) – path in the hdf5 where the link is created.</li> -<li><strong>overwrite</strong> (<em>bool</em>) – if set to True, an entry already existing at the same location will be overwritten. If set</li> -<li><strong>False</strong><strong>, </strong><strong>an attempt to overwrite an entry will raise an error.</strong> (<em>to</em>) – </li> +<li><strong>group</strong> (<em>str</em>) – internal HDF5 path of the group to which the link points.</li> +<li><strong>path</strong> (<em>str</em>) – path in the hdf5 where the link is created.</li> +<li><strong>overwrite</strong> (<em>bool</em>) – if set to True, an entry already existing at the same location will be overwritten. If set</li> +<li><strong>False</strong><strong>, </strong><strong>an attempt to overwrite an entry will raise an error.</strong> (<em>to</em>) – </li> </ul> </td> </tr> @@ -328,6 +324,42 @@ operations on the file that are not covered by CXI Writer API. Use it at your o stacks can be added to the CXI Writer after initialization.</p> </dd></dl> +<dl class="method"> +<dt id="cfelpyutils.cfel_cxi.CXIWriter.is_entry_in_file"> +<code class="descname">is_entry_in_file</code><span class="sig-paren">(</span><em>path</em><span class="sig-paren">)</span><a class="headerlink" href="#cfelpyutils.cfel_cxi.CXIWriter.is_entry_in_file" title="Permalink to this definition">¶</a></dt> +<dd><p>Checks if an entry is already present in the file.</p> +<p>Checks if an entry is already present in the file at the path provided by the user. It will return True if +either a dataset or a group are present at the specified path</p> +<table class="docutils field-list" frame="void" rules="none"> +<col class="field-name" /> +<col class="field-body" /> +<tbody valign="top"> +<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>path</strong> (<em>str</em>) – the path where to check for a dataset or group</td> +</tr> +</tbody> +</table> +<p>Results:</p> +<blockquote> +<div>ret (bool): True if a group or dataset can be found in the file, False otherwise</div></blockquote> +</dd></dl> + +<dl class="method"> +<dt id="cfelpyutils.cfel_cxi.CXIWriter.num_slices_in_file"> +<code class="descname">num_slices_in_file</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#cfelpyutils.cfel_cxi.CXIWriter.num_slices_in_file" title="Permalink to this definition">¶</a></dt> +<dd><p>Returns the number of slices already written in the file</p> +<p>Returns the number of slices that have already been written in the file.</p> +<table class="docutils field-list" frame="void" rules="none"> +<col class="field-name" /> +<col class="field-body" /> +<tbody valign="top"> +<tr class="field-odd field"><th class="field-name">Returns:</th><td class="field-body">number of writter slices</td> +</tr> +<tr class="field-even field"><th class="field-name">Return type:</th><td class="field-body">status (num_slices)</td> +</tr> +</tbody> +</table> +</dd></dl> + <dl class="method"> <dt id="cfelpyutils.cfel_cxi.CXIWriter.stacks_are_initialized"> <code class="descname">stacks_are_initialized</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#cfelpyutils.cfel_cxi.CXIWriter.stacks_are_initialized" title="Permalink to this definition">¶</a></dt> @@ -357,11 +389,11 @@ operations (for example, creating a link).</p> <col class="field-body" /> <tbody valign="top"> <tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first last simple"> -<li><strong>name</strong> (<em>str</em>) – entry name</li> -<li><strong>path</strong> (<em>str</em>) – path in the hdf5 file where the entry will be written.</li> -<li><strong>data</strong> (<em>Union</em><em>[</em><em>numpy.ndarray</em><em>, </em><em>bytes</em><em>, </em><em>int</em><em>, </em><em>float</em><em>]</em><em></em>) – data to write</li> -<li><strong>overwrite</strong> (<em>bool</em>) – if set to True, an entry already existing at the same location will be overwritten. If set</li> -<li><strong>False</strong><strong>, </strong><strong>an attempt to overwrite an entry will raise an error.</strong> (<em>to</em>) – </li> +<li><strong>name</strong> (<em>str</em>) – entry name</li> +<li><strong>path</strong> (<em>str</em>) – path in the hdf5 file where the entry will be written.</li> +<li><strong>data</strong> (<em>Union</em><em>[</em><em>numpy.ndarray</em><em>, </em><em>bytes</em><em>, </em><em>int</em><em>, </em><em>float</em><em>]</em>) – data to write</li> +<li><strong>overwrite</strong> (<em>bool</em>) – if set to True, an entry already existing at the same location will be overwritten. If set</li> +<li><strong>False</strong><strong>, </strong><strong>an attempt to overwrite an entry will raise an error.</strong> (<em>to</em>) – </li> </ul> </td> </tr> @@ -397,7 +429,7 @@ it (See the documentation of the fabio python module).</p> <col class="field-name" /> <col class="field-body" /> <tbody valign="top"> -<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>stream</strong> (<em>str</em>) – a data string buffer received from the PETRAIII P11 sender.</td> +<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>stream</strong> (<em>str</em>) – a data string buffer received from the PETRAIII P11 sender.</td> </tr> <tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><dl class="docutils"> <dt>a cbfimage object containing the data extracted</dt> @@ -417,11 +449,53 @@ it (See the documentation of the fabio python module).</p> <p>Utilities for CrystFEL-style geometry files.</p> <p>This module contains utilities for the processing of CrystFEL-style geometry files.</p> +<dl class="class"> +<dt id="cfelpyutils.cfel_geom.ImageShape"> +<em class="property">class </em><code class="descclassname">cfelpyutils.cfel_geom.</code><code class="descname">ImageShape</code><span class="sig-paren">(</span><em>ss</em>, <em>fs</em><span class="sig-paren">)</span><a class="headerlink" href="#cfelpyutils.cfel_geom.ImageShape" title="Permalink to this definition">¶</a></dt> +<dd><p>Bases: <code class="xref py py-class docutils literal"><span class="pre">tuple</span></code></p> +<dl class="attribute"> +<dt id="cfelpyutils.cfel_geom.ImageShape.fs"> +<code class="descname">fs</code><a class="headerlink" href="#cfelpyutils.cfel_geom.ImageShape.fs" title="Permalink to this definition">¶</a></dt> +<dd><p>Alias for field number 1</p> +</dd></dl> + +<dl class="attribute"> +<dt id="cfelpyutils.cfel_geom.ImageShape.ss"> +<code class="descname">ss</code><a class="headerlink" href="#cfelpyutils.cfel_geom.ImageShape.ss" title="Permalink to this definition">¶</a></dt> +<dd><p>Alias for field number 0</p> +</dd></dl> + +</dd></dl> + +<dl class="class"> +<dt id="cfelpyutils.cfel_geom.PixelMaps"> +<em class="property">class </em><code class="descclassname">cfelpyutils.cfel_geom.</code><code class="descname">PixelMaps</code><span class="sig-paren">(</span><em>x</em>, <em>y</em>, <em>r</em><span class="sig-paren">)</span><a class="headerlink" href="#cfelpyutils.cfel_geom.PixelMaps" title="Permalink to this definition">¶</a></dt> +<dd><p>Bases: <code class="xref py py-class docutils literal"><span class="pre">tuple</span></code></p> +<dl class="attribute"> +<dt id="cfelpyutils.cfel_geom.PixelMaps.r"> +<code class="descname">r</code><a class="headerlink" href="#cfelpyutils.cfel_geom.PixelMaps.r" title="Permalink to this definition">¶</a></dt> +<dd><p>Alias for field number 2</p> +</dd></dl> + +<dl class="attribute"> +<dt id="cfelpyutils.cfel_geom.PixelMaps.x"> +<code class="descname">x</code><a class="headerlink" href="#cfelpyutils.cfel_geom.PixelMaps.x" title="Permalink to this definition">¶</a></dt> +<dd><p>Alias for field number 0</p> +</dd></dl> + +<dl class="attribute"> +<dt id="cfelpyutils.cfel_geom.PixelMaps.y"> +<code class="descname">y</code><a class="headerlink" href="#cfelpyutils.cfel_geom.PixelMaps.y" title="Permalink to this definition">¶</a></dt> +<dd><p>Alias for field number 1</p> +</dd></dl> + +</dd></dl> + <dl class="function"> <dt id="cfelpyutils.cfel_geom.apply_geometry_from_file"> <code class="descclassname">cfelpyutils.cfel_geom.</code><code class="descname">apply_geometry_from_file</code><span class="sig-paren">(</span><em>data_as_slab</em>, <em>geometry_filename</em><span class="sig-paren">)</span><a class="headerlink" href="#cfelpyutils.cfel_geom.apply_geometry_from_file" title="Permalink to this definition">¶</a></dt> <dd><p>Parses a geometry file and applies the geometry to data.</p> -<p>Parses a geometry file and applies the geometry to detector data in ‘slab’ format. Turns a 2d array of pixel +<p>Parses a geometry file and applies the geometry to detector data in ‘slab’ format. Turns a 2d array of pixel values into an array containing a representation of the physical layout of the detector, keeping the origin of the reference system at the beam interaction point.</p> <table class="docutils field-list" frame="void" rules="none"> @@ -429,8 +503,8 @@ the reference system at the beam interaction point.</p> <col class="field-body" /> <tbody valign="top"> <tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple"> -<li><strong>data_as_slab</strong> (<em>numpy.ndarray</em>) – the pixel values to which geometry is to be applied.</li> -<li><strong>geometry_filename</strong> (<em>str</em>) – geometry filename.</li> +<li><strong>data_as_slab</strong> (<em>numpy.ndarray</em>) – the pixel values to which geometry is to be applied.</li> +<li><strong>geometry_filename</strong> (<em>str</em>) – geometry filename.</li> </ul> </td> </tr> @@ -447,9 +521,9 @@ detector, with the origin of the reference system at the beam interaction point <dl class="function"> <dt id="cfelpyutils.cfel_geom.apply_geometry_from_pixel_maps"> -<code class="descclassname">cfelpyutils.cfel_geom.</code><code class="descname">apply_geometry_from_pixel_maps</code><span class="sig-paren">(</span><em>data_as_slab</em>, <em>yx</em>, <em>im_out=None</em><span class="sig-paren">)</span><a class="headerlink" href="#cfelpyutils.cfel_geom.apply_geometry_from_pixel_maps" title="Permalink to this definition">¶</a></dt> +<code class="descclassname">cfelpyutils.cfel_geom.</code><code class="descname">apply_geometry_from_pixel_maps</code><span class="sig-paren">(</span><em>data_as_slab</em>, <em>y</em>, <em>x</em>, <em>im_out=None</em><span class="sig-paren">)</span><a class="headerlink" href="#cfelpyutils.cfel_geom.apply_geometry_from_pixel_maps" title="Permalink to this definition">¶</a></dt> <dd><p>Applies geometry in pixel map format to data.</p> -<p>Applies geometry, in the form of pixel maps, to detector data in ‘slab’ format. Turns a 2d array of pixel values +<p>Applies geometry, in the form of pixel maps, to detector data in ‘slab’ format. Turns a 2d array of pixel values into an array containing a representation of the physical layout of the detector, keeping the origin of the reference system at the beam interaction point.</p> <table class="docutils field-list" frame="void" rules="none"> @@ -457,10 +531,11 @@ reference system at the beam interaction point.</p> <col class="field-body" /> <tbody valign="top"> <tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple"> -<li><strong>data_as_slab</strong> (<em>numpy.ndarray</em>) – the pixel values to which geometry is to be applied.</li> -<li><strong>yx</strong> (<em>tuple</em>) – the yx pixel maps describing the geometry of the detector; each map is a numpy.ndarray.</li> -<li><strong>im_out</strong> (<em>Optional</em><em>[</em><em>numpy.ndarray</em><em>]</em><em></em>) – array to hold the output; if not provided, one will be generated</li> -<li><strong>automatically.</strong> – </li> +<li><strong>data_as_slab</strong> (<em>numpy.ndarray</em>) – the pixel values to which geometry is to be applied.</li> +<li><strong>y</strong> (<em>numpy.ndarray</em>) – the y pixel map describing the geometry of the detector</li> +<li><strong>x</strong> (<em>numpy.ndarray</em>) – the x pixel map describing the geometry of the detector</li> +<li><strong>im_out</strong> (<em>Optional</em><em>[</em><em>numpy.ndarray</em><em>]</em>) – array to hold the output; if not provided, one will be generated</li> +<li><strong>automatically.</strong> – </li> </ul> </td> </tr> @@ -475,27 +550,47 @@ detector, with the origin of the reference system at the beam interaction point </table> </dd></dl> +<dl class="function"> +<dt id="cfelpyutils.cfel_geom.get_image_shape"> +<code class="descclassname">cfelpyutils.cfel_geom.</code><code class="descname">get_image_shape</code><span class="sig-paren">(</span><em>geometry_filename</em><span class="sig-paren">)</span><a class="headerlink" href="#cfelpyutils.cfel_geom.get_image_shape" title="Permalink to this definition">¶</a></dt> +<dd><p>Parses a geometry file and returns the minimum size of an image that can represent the detector.</p> +<p>Parses the geometry file and return a numpy shape object representing the minimum size of an image that +can contain the physical representation of the detector. The representation is centered at the point where the beam +hits the detector according to the geometry in the file.</p> +<table class="docutils field-list" frame="void" rules="none"> +<col class="field-name" /> +<col class="field-body" /> +<tbody valign="top"> +<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>geometry_filename</strong> (<em>str</em>) – geometry filename.</td> +</tr> +<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body">shape of the array needed to contain the representation of the physical layout +of the detector.</td> +</tr> +<tr class="field-odd field"><th class="field-name">Return type:</th><td class="field-body">img_shape tuple (int, int)</td> +</tr> +</tbody> +</table> +</dd></dl> + <dl class="function"> <dt id="cfelpyutils.cfel_geom.pixel_maps_for_image_view"> <code class="descclassname">cfelpyutils.cfel_geom.</code><code class="descname">pixel_maps_for_image_view</code><span class="sig-paren">(</span><em>geometry_filename</em><span class="sig-paren">)</span><a class="headerlink" href="#cfelpyutils.cfel_geom.pixel_maps_for_image_view" title="Permalink to this definition">¶</a></dt> <dd><p>Parses a geometry file and creates pixel maps for pyqtgraph visualization.</p> -<p>Parse the geometry file and creates pixel maps for an array in ‘slab’ format containing pixel values. The pixel +<p>Parses the geometry file and creates pixel maps for an array in ‘slab’ format containing pixel values. The pixel maps can be used to create a representation of the physical layout of the detector in a pyqtgraph ImageView widget (i.e. they apply the detector geometry setting the origin of the reference system is in the top left corner -of the output array).</p> +of the output array). The representation is centered at the point where the beam hits the detector according to +the geometry in the file.</p> <table class="docutils field-list" frame="void" rules="none"> <col class="field-name" /> <col class="field-body" /> <tbody valign="top"> -<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>geometry_filename</strong> (<em>str</em>) – geometry filename.</td> +<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>geometry_filename</strong> (<em>str</em>) – geometry filename.</td> </tr> -<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body">pixel maps<p>slab_shape tuple (int, int): shape of the original geometry uncorrected array (the pixel values in “slab” -format).</p> -<p>img_shape tuple (int, int): shape of the array needed to contain the representation of the physical layout -of the detector.</p> +<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body">pixel map for x coordinate<p>y (numpy.ndarray int): pixel map for x coordinate</p> </td> </tr> -<tr class="field-odd field"><th class="field-name">Return type:</th><td class="field-body">(y, x) (numpy.ndarray int, numpy.ndarray int)</td> +<tr class="field-odd field"><th class="field-name">Return type:</th><td class="field-body"><a class="reference internal" href="#cfelpyutils.cfel_geom.PixelMaps.x" title="cfelpyutils.cfel_geom.PixelMaps.x">x</a> (numpy.ndarray int)</td> </tr> </tbody> </table> @@ -512,12 +607,12 @@ point.</p> <col class="field-name" /> <col class="field-body" /> <tbody valign="top"> -<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>fnam</strong> (<em>str</em>) – geometry filename.</td> +<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>fnam</strong> (<em>str</em>) – geometry filename.</td> </tr> <tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body">slab-like pixel maps with respectively x, y coordinates of the pixel and distance of the pixel from the center of the reference system.</td> </tr> -<tr class="field-odd field"><th class="field-name">Return type:</th><td class="field-body">x,y,r (numpy.ndarray float, numpy.ndarray float, numpy.ndarray float)</td> +<tr class="field-odd field"><th class="field-name">Return type:</th><td class="field-body"><a class="reference internal" href="#cfelpyutils.cfel_geom.PixelMaps.x" title="cfelpyutils.cfel_geom.PixelMaps.x">x</a>,<a class="reference internal" href="#cfelpyutils.cfel_geom.PixelMaps.y" title="cfelpyutils.cfel_geom.PixelMaps.y">y</a>,<a class="reference internal" href="#cfelpyutils.cfel_geom.PixelMaps.r" title="cfelpyutils.cfel_geom.PixelMaps.r">r</a> (numpy.ndarray float, numpy.ndarray float, numpy.ndarray float)</td> </tr> </tbody> </table> @@ -538,8 +633,8 @@ on what the h5py module already provides.</p> <col class="field-body" /> <tbody valign="top"> <tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple"> -<li><strong>data_filename</strong> (<em>str</em>) – filename of the file to read.</li> -<li><strong>data_group</strong> (<em>str</em>) – internal HDF5 path of the data block to read.</li> +<li><strong>data_filename</strong> (<em>str</em>) – filename of the file to read.</li> +<li><strong>data_group</strong> (<em>str</em>) – internal HDF5 path of the data block to read.</li> </ul> </td> </tr> @@ -599,7 +694,7 @@ the parser tries to interpret the entry in order as:</p> <col class="field-name" /> <col class="field-body" /> <tbody valign="top"> -<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>config</strong> (<em>class RawConfigParser</em>) – ConfigParser instance.</td> +<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>config</strong> (<em>class RawConfigParser</em>) – ConfigParser instance.</td> </tr> <tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body">dictionary with the same structure as the input dictionary, but with correct types assigned to each entry.</td> @@ -619,13 +714,13 @@ assigned to each entry.</td> <dt id="cfelpyutils.cfel_psana.dirname_from_source_runs"> <code class="descclassname">cfelpyutils.cfel_psana.</code><code class="descname">dirname_from_source_runs</code><span class="sig-paren">(</span><em>source</em><span class="sig-paren">)</span><a class="headerlink" href="#cfelpyutils.cfel_psana.dirname_from_source_runs" title="Permalink to this definition">¶</a></dt> <dd><p>Returns a directory name based on a psana source string.</p> -<p>Takes a psana source string (e.g exp=CXI/cxix....) and returns a string that can be used as a subdirectory name or +<p>Takes a psana source string (e.g exp=CXI/cxix….) and returns a string that can be used as a subdirectory name or a prefix for files and directories.</p> <table class="docutils field-list" frame="void" rules="none"> <col class="field-name" /> <col class="field-body" /> <tbody valign="top"> -<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>source</strong> (<em>str</em>) – a psana source string (e.g. exp=CXI/cxi....).</td> +<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>source</strong> (<em>str</em>) – a psana source string (e.g. exp=CXI/cxi….).</td> </tr> <tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body">a string that can be used as a filename or a prefix .</td> </tr> @@ -639,13 +734,13 @@ a prefix for files and directories.</p> <dt id="cfelpyutils.cfel_psana.psana_event_inspection"> <code class="descclassname">cfelpyutils.cfel_psana.</code><code class="descname">psana_event_inspection</code><span class="sig-paren">(</span><em>source</em><span class="sig-paren">)</span><a class="headerlink" href="#cfelpyutils.cfel_psana.psana_event_inspection" title="Permalink to this definition">¶</a></dt> <dd><p>Prints the structure of psana events.</p> -<p>Takes a psana source string (e.g. exp=CXI/cxix....) and inspects the structure of the first event in the data, +<p>Takes a psana source string (e.g. exp=CXI/cxix….) and inspects the structure of the first event in the data, printing information about the the content of the event.</p> <table class="docutils field-list" frame="void" rules="none"> <col class="field-name" /> <col class="field-body" /> <tbody valign="top"> -<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>source</strong> (<em>str</em>) – a psana source string (e.g. exp=CXI/cxix....).</td> +<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>source</strong> (<em>str</em>) – a psana source string (e.g. exp=CXI/cxix….).</td> </tr> </tbody> </table> @@ -660,7 +755,7 @@ printing information about the the content of the event.</p> <col class="field-name" /> <col class="field-body" /> <tbody valign="top"> -<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>name</strong> (<em>str</em>) – a string describing a python type.</td> +<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>name</strong> (<em>str</em>) – a string describing a python type.</td> </tr> <tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body">the python type described by the string.</td> </tr> @@ -705,7 +800,7 @@ python to work with several file format used in x-ray imaging).</p> </div> <div class="footer" role="contentinfo"> © Copyright 2016, CFEL Team. - Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.5.1. + Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.6.3. </div> </body> </html> \ No newline at end of file diff --git a/doc/build/html/genindex.html b/doc/build/html/genindex.html index 0fba7bf..0d9e625 100644 --- a/doc/build/html/genindex.html +++ b/doc/build/html/genindex.html @@ -3,16 +3,12 @@ <!doctype html> - <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> - <title>Index — cfelpyutils 0.5 documentation</title> - <link rel="stylesheet" href="_static/bizstyle.css" type="text/css" /> <link rel="stylesheet" href="_static/pygments.css" type="text/css" /> - <script type="text/javascript"> var DOCUMENTATION_OPTIONS = { URL_ROOT: './', @@ -34,7 +30,7 @@ <script type="text/javascript" src="_static/css3-mediaqueries.js"></script> <![endif]--> </head> - <body role="document"> + <body> <div class="related" role="navigation" aria-label="related navigation"> <h3>Navigation</h3> <ul> @@ -81,10 +77,13 @@ | <a href="#G"><strong>G</strong></a> | <a href="#I"><strong>I</strong></a> | <a href="#L"><strong>L</strong></a> + | <a href="#N"><strong>N</strong></a> | <a href="#P"><strong>P</strong></a> | <a href="#R"><strong>R</strong></a> | <a href="#S"><strong>S</strong></a> | <a href="#W"><strong>W</strong></a> + | <a href="#X"><strong>X</strong></a> + | <a href="#Y"><strong>Y</strong></a> </div> <h2 id="A">A</h2> @@ -147,6 +146,10 @@ <table style="width: 100%" class="indextable genindextable"><tr> <td style="width: 33%; vertical-align: top;"><ul> <li><a href="cfelpyutils.html#cfelpyutils.cfel_cxi.CXIWriter.file_is_full">file_is_full() (cfelpyutils.cfel_cxi.CXIWriter method)</a> +</li> + </ul></td> + <td style="width: 33%; vertical-align: top;"><ul> + <li><a href="cfelpyutils.html#cfelpyutils.cfel_geom.ImageShape.fs">fs (cfelpyutils.cfel_geom.ImageShape attribute)</a> </li> </ul></td> </tr></table> @@ -155,14 +158,24 @@ <table style="width: 100%" class="indextable genindextable"><tr> <td style="width: 33%; vertical-align: top;"><ul> <li><a href="cfelpyutils.html#cfelpyutils.cfel_cxi.CXIWriter.get_file_handle">get_file_handle() (cfelpyutils.cfel_cxi.CXIWriter method)</a> +</li> + </ul></td> + <td style="width: 33%; vertical-align: top;"><ul> + <li><a href="cfelpyutils.html#cfelpyutils.cfel_geom.get_image_shape">get_image_shape() (in module cfelpyutils.cfel_geom)</a> </li> </ul></td> </tr></table> <h2 id="I">I</h2> <table style="width: 100%" class="indextable genindextable"><tr> + <td style="width: 33%; vertical-align: top;"><ul> + <li><a href="cfelpyutils.html#cfelpyutils.cfel_geom.ImageShape">ImageShape (class in cfelpyutils.cfel_geom)</a> +</li> + </ul></td> <td style="width: 33%; vertical-align: top;"><ul> <li><a href="cfelpyutils.html#cfelpyutils.cfel_cxi.CXIWriter.initialize_stacks">initialize_stacks() (cfelpyutils.cfel_cxi.CXIWriter method)</a> +</li> + <li><a href="cfelpyutils.html#cfelpyutils.cfel_cxi.CXIWriter.is_entry_in_file">is_entry_in_file() (cfelpyutils.cfel_cxi.CXIWriter method)</a> </li> </ul></td> </tr></table> @@ -179,16 +192,26 @@ </ul></td> </tr></table> +<h2 id="N">N</h2> +<table style="width: 100%" class="indextable genindextable"><tr> + <td style="width: 33%; vertical-align: top;"><ul> + <li><a href="cfelpyutils.html#cfelpyutils.cfel_cxi.CXIWriter.num_slices_in_file">num_slices_in_file() (cfelpyutils.cfel_cxi.CXIWriter method)</a> +</li> + </ul></td> +</tr></table> + <h2 id="P">P</h2> <table style="width: 100%" class="indextable genindextable"><tr> <td style="width: 33%; vertical-align: top;"><ul> <li><a href="cfelpyutils.html#cfelpyutils.cfel_optarg.parse_parameters">parse_parameters() (in module cfelpyutils.cfel_optarg)</a> </li> <li><a href="cfelpyutils.html#cfelpyutils.cfel_geom.pixel_maps_for_image_view">pixel_maps_for_image_view() (in module cfelpyutils.cfel_geom)</a> +</li> + <li><a href="cfelpyutils.html#cfelpyutils.cfel_geom.pixel_maps_from_geometry_file">pixel_maps_from_geometry_file() (in module cfelpyutils.cfel_geom)</a> </li> </ul></td> <td style="width: 33%; vertical-align: top;"><ul> - <li><a href="cfelpyutils.html#cfelpyutils.cfel_geom.pixel_maps_from_geometry_file">pixel_maps_from_geometry_file() (in module cfelpyutils.cfel_geom)</a> + <li><a href="cfelpyutils.html#cfelpyutils.cfel_geom.PixelMaps">PixelMaps (class in cfelpyutils.cfel_geom)</a> </li> <li><a href="cfelpyutils.html#cfelpyutils.cfel_psana.psana_event_inspection">psana_event_inspection() (in module cfelpyutils.cfel_psana)</a> </li> @@ -199,6 +222,10 @@ <h2 id="R">R</h2> <table style="width: 100%" class="indextable genindextable"><tr> + <td style="width: 33%; vertical-align: top;"><ul> + <li><a href="cfelpyutils.html#cfelpyutils.cfel_geom.PixelMaps.r">r (cfelpyutils.cfel_geom.PixelMaps attribute)</a> +</li> + </ul></td> <td style="width: 33%; vertical-align: top;"><ul> <li><a href="cfelpyutils.html#cfelpyutils.cfel_fabio.read_cbf_from_stream">read_cbf_from_stream() (in module cfelpyutils.cfel_fabio)</a> </li> @@ -207,6 +234,10 @@ <h2 id="S">S</h2> <table style="width: 100%" class="indextable genindextable"><tr> + <td style="width: 33%; vertical-align: top;"><ul> + <li><a href="cfelpyutils.html#cfelpyutils.cfel_geom.ImageShape.ss">ss (cfelpyutils.cfel_geom.ImageShape attribute)</a> +</li> + </ul></td> <td style="width: 33%; vertical-align: top;"><ul> <li><a href="cfelpyutils.html#cfelpyutils.cfel_cxi.CXIWriter.stacks_are_initialized">stacks_are_initialized() (cfelpyutils.cfel_cxi.CXIWriter method)</a> </li> @@ -225,6 +256,22 @@ </ul></td> </tr></table> +<h2 id="X">X</h2> +<table style="width: 100%" class="indextable genindextable"><tr> + <td style="width: 33%; vertical-align: top;"><ul> + <li><a href="cfelpyutils.html#cfelpyutils.cfel_geom.PixelMaps.x">x (cfelpyutils.cfel_geom.PixelMaps attribute)</a> +</li> + </ul></td> +</tr></table> + +<h2 id="Y">Y</h2> +<table style="width: 100%" class="indextable genindextable"><tr> + <td style="width: 33%; vertical-align: top;"><ul> + <li><a href="cfelpyutils.html#cfelpyutils.cfel_geom.PixelMaps.y">y (cfelpyutils.cfel_geom.PixelMaps attribute)</a> +</li> + </ul></td> +</tr></table> + </div> @@ -246,7 +293,7 @@ </div> <div class="footer" role="contentinfo"> © Copyright 2016, CFEL Team. - Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.5.1. + Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.6.3. </div> </body> </html> \ No newline at end of file diff --git a/doc/build/html/index.html b/doc/build/html/index.html index a6a7ca4..24135d0 100644 --- a/doc/build/html/index.html +++ b/doc/build/html/index.html @@ -2,16 +2,12 @@ <!doctype html> - <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> - <title>Welcome to cfelpyutils’s documentation! — cfelpyutils 0.5 documentation</title> - <link rel="stylesheet" href="_static/bizstyle.css" type="text/css" /> <link rel="stylesheet" href="_static/pygments.css" type="text/css" /> - <script type="text/javascript"> var DOCUMENTATION_OPTIONS = { URL_ROOT: './', @@ -33,7 +29,7 @@ <script type="text/javascript" src="_static/css3-mediaqueries.js"></script> <![endif]--> </head> - <body role="document"> + <body> <div class="related" role="navigation" aria-label="related navigation"> <h3>Navigation</h3> <ul> @@ -50,7 +46,7 @@ <div class="sphinxsidebarwrapper"> <h3><a href="#">Table Of Contents</a></h3> <ul> -<li><a class="reference internal" href="#">Welcome to cfelpyutils’s documentation!</a></li> +<li><a class="reference internal" href="#">Welcome to cfelpyutils’s documentation!</a></li> <li><a class="reference internal" href="#indices-and-tables">Indices and tables</a></li> </ul> @@ -80,7 +76,7 @@ <div class="body" role="main"> <div class="section" id="welcome-to-cfelpyutils-s-documentation"> -<h1>Welcome to cfelpyutils’s documentation!<a class="headerlink" href="#welcome-to-cfelpyutils-s-documentation" title="Permalink to this headline">¶</a></h1> +<h1>Welcome to cfelpyutils’s documentation!<a class="headerlink" href="#welcome-to-cfelpyutils-s-documentation" title="Permalink to this headline">¶</a></h1> <p>Contents:</p> <div class="toctree-wrapper compound"> </div> @@ -114,7 +110,7 @@ </div> <div class="footer" role="contentinfo"> © Copyright 2016, CFEL Team. - Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.5.1. + Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.6.3. </div> </body> </html> \ No newline at end of file diff --git a/doc/build/html/modules.html b/doc/build/html/modules.html index f1a6dd5..ab88216 100644 --- a/doc/build/html/modules.html +++ b/doc/build/html/modules.html @@ -2,16 +2,12 @@ <!doctype html> - <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> - <title>cfelpyutils — cfelpyutils 0.5 documentation</title> - <link rel="stylesheet" href="_static/bizstyle.css" type="text/css" /> <link rel="stylesheet" href="_static/pygments.css" type="text/css" /> - <script type="text/javascript"> var DOCUMENTATION_OPTIONS = { URL_ROOT: './', @@ -33,7 +29,7 @@ <script type="text/javascript" src="_static/css3-mediaqueries.js"></script> <![endif]--> </head> - <body role="document"> + <body> <div class="related" role="navigation" aria-label="related navigation"> <h3>Navigation</h3> <ul> @@ -113,7 +109,7 @@ </div> <div class="footer" role="contentinfo"> © Copyright 2016, CFEL Team. - Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.5.1. + Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.6.3. </div> </body> </html> \ No newline at end of file diff --git a/doc/build/html/objects.inv b/doc/build/html/objects.inv index 8ee46f78e15a12170b6850d5ea93acc4751f053c..58c022b672f3c592ec4e297d5730487d69699b63 100644 GIT binary patch delta 614 zcmV-s0-61X1=t0UeSep|Zrd;rfOkKIigY!R4q38x@(>_EhIAv&;z?pdkpxL4R;Rv3 zU$0NnqbSQx?Zu=PK_+=0@BiewL1o7wNaZU#KK4co3ak67KCQDZ^y)6{Y`<39&G}w@ z=d~MspqFw2QwGHHi??Wc3~r3zX3%wzMpxf1(bt&=S)kBCvVZSCcCStbbP-c4@cx#& zPvQ)O;66b8#)IJ>3zAIhjL2nLi&}620U~w67ei}hJn}}8zlu=~As|;$zpcrNwzkd; zwip_%<kItIP^uW#Vwl{<JJ4bU?@29#1SNlAimWdudXAb(iA%jsfc4OGuVjsWHDofC zgQLJK4iLrIsej_Qm%XI`O-@(~Io0&!1Ws`$r72T;x*>z#z+RgCel>|RsuSv-`-V5p zP;>(Q?z4JlY`po(L}|9`p~aUDEZ*Ke{{ygQ%6|yK$^8&8o8wD3&+>rk39QewXOU-a z4K3JV70OsZp&6vcWk{!_J2rx>l)Fl_QCHs2j?d%9{(mfE9&mrm$UM+V8QvH-Gv6hC ztb>g9o~+MxWha`4{OXO;={rnYa1Q1$#N~XIj1A!0e5H~+BZcS#g`PkzLYJ2j)`Nz8 zRVHyJq|>Ct+-c3=Xa=}J7ih$$C&zahAT&z6#RMq@n*GmZ9!TBZ$g6x1kHXZ|_VVoc zLS<<dQeQD_TGUbtJWPTL_Vl-aM31XUZWmuSr(-k!?8Gaon#!OG=KPYszyJ7(4i9n2 zLbTw^hC+4aK09uY8wvQ7Vx4YI;r(RWymVpL#v{18`%F)3>Fi6|e~z~Q1EibmE^s?H A1ONa4 delta 533 zcmV+w0_y$P1&0NYeSem*j@vK{hIc=Oix%h<qaC{3+UbS@2Xwe@0wd8jd$J@*@?G4g zFJ(D)4#{$I7DJ}QPd`bMiEL53X^f;p?WTvps!?P8t(Kd;>Eob3=bgis`cPf&rL~ZL z3XvE435~X();H0i9WeSSf!oo@NY>QfuhF-eC)y$CM9t4XkAKgeBKm}p8bbKU-J5#@ zN{J9bzKCeW+lu7SdaFvA&Y@94L4-t|@w=f?+km1a&ev{~M~EminU{OAQmmb~quUKl zQ3?v89kt#K>oCq~6FnGphwPD|NTBH-=E{cM#EcQ(Ip`Ixc4OzSSp*s!2ajgy)q5c4 zehHc+3eG8u=6|nX;2R3~EgZ>~&w|;#;ct*9)3Ft;w*$-L_n~MmrJ+_XCV8jk*V8&3 zv!Zj?7U{W3badkF0bD5OZVb^{FKB=c#Vg_4eUM4!Cb~2Oy=s4yS0s7o-!0?7dswoU z%;l1-i{QI*QQ5y?K|Ij;37jJIWrcJB43tZm-5W*Tuz!f9d+g}Bul;CtC~D@Xz*im$ zJRX9>4A~2`$G>Zjlj%Olt3y-|%F6n1efH8&JDzXc3{{7QjKb6GsNu+equBLq&3=z* zS#8G_{>6!B)RNnvj`s4Buc79nV;Y-~^na?jP&aOK)8V|4aldk<^S!ya?;=}FS5Z{~ X!OQ+VJr3LQ+248pDMkJte~{u%H3S>u diff --git a/doc/build/html/py-modindex.html b/doc/build/html/py-modindex.html index 47a2c1e..d314a49 100644 --- a/doc/build/html/py-modindex.html +++ b/doc/build/html/py-modindex.html @@ -2,16 +2,12 @@ <!doctype html> - <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> - <title>Python Module Index — cfelpyutils 0.5 documentation</title> - <link rel="stylesheet" href="_static/bizstyle.css" type="text/css" /> <link rel="stylesheet" href="_static/pygments.css" type="text/css" /> - <script type="text/javascript"> var DOCUMENTATION_OPTIONS = { URL_ROOT: './', @@ -36,7 +32,7 @@ </head> - <body role="document"> + <body> <div class="related" role="navigation" aria-label="related navigation"> <h3>Navigation</h3> <ul> @@ -143,7 +139,7 @@ </div> <div class="footer" role="contentinfo"> © Copyright 2016, CFEL Team. - Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.5.1. + Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.6.3. </div> </body> </html> \ No newline at end of file diff --git a/doc/build/html/search.html b/doc/build/html/search.html index 0132947..69f4a4c 100644 --- a/doc/build/html/search.html +++ b/doc/build/html/search.html @@ -2,16 +2,12 @@ <!doctype html> - <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> - <title>Search — cfelpyutils 0.5 documentation</title> - <link rel="stylesheet" href="_static/bizstyle.css" type="text/css" /> <link rel="stylesheet" href="_static/pygments.css" type="text/css" /> - <script type="text/javascript"> var DOCUMENTATION_OPTIONS = { URL_ROOT: './', @@ -41,7 +37,7 @@ <![endif]--> </head> - <body role="document"> + <body> <div class="related" role="navigation" aria-label="related navigation"> <h3>Navigation</h3> <ul> @@ -107,7 +103,7 @@ </div> <div class="footer" role="contentinfo"> © Copyright 2016, CFEL Team. - Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.5.1. + Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.6.3. </div> </body> </html> \ No newline at end of file diff --git a/doc/build/html/searchindex.js b/doc/build/html/searchindex.js index 113258d..87f178a 100644 --- a/doc/build/html/searchindex.js +++ b/doc/build/html/searchindex.js @@ -1 +1 @@ -Search.setIndex({docnames:["cfelpyutils","index","modules"],envversion:51,filenames:["cfelpyutils.rst","index.rst","modules.rst"],objects:{"":{cfelpyutils:[0,0,0,"-"]},"cfelpyutils.cfel_crystfel":{load_crystfel_geometry:[0,1,1,""]},"cfelpyutils.cfel_cxi":{CXIWriter:[0,2,1,""]},"cfelpyutils.cfel_cxi.CXIWriter":{add_stack_to_writer:[0,3,1,""],append_data_to_stack:[0,3,1,""],close_file:[0,3,1,""],create_link:[0,3,1,""],create_link_to_group:[0,3,1,""],file_is_full:[0,3,1,""],get_file_handle:[0,3,1,""],initialize_stacks:[0,3,1,""],stacks_are_initialized:[0,3,1,""],write_simple_entry:[0,3,1,""],write_stack_slice_and_increment:[0,3,1,""]},"cfelpyutils.cfel_fabio":{read_cbf_from_stream:[0,1,1,""]},"cfelpyutils.cfel_geom":{apply_geometry_from_file:[0,1,1,""],apply_geometry_from_pixel_maps:[0,1,1,""],pixel_maps_for_image_view:[0,1,1,""],pixel_maps_from_geometry_file:[0,1,1,""]},"cfelpyutils.cfel_hdf5":{load_nparray_from_hdf5_file:[0,1,1,""]},"cfelpyutils.cfel_optarg":{parse_parameters:[0,1,1,""]},"cfelpyutils.cfel_psana":{dirname_from_source_runs:[0,1,1,""],psana_event_inspection:[0,1,1,""],psana_obj_from_string:[0,1,1,""]},cfelpyutils:{cfel_crystfel:[0,0,0,"-"],cfel_cxi:[0,0,0,"-"],cfel_fabio:[0,0,0,"-"],cfel_geom:[0,0,0,"-"],cfel_hdf5:[0,0,0,"-"],cfel_optarg:[0,0,0,"-"],cfel_psana:[0,0,0,"-"]}},objnames:{"0":["py","module","Python module"],"1":["py","function","Python function"],"2":["py","class","Python class"],"3":["py","method","Python method"]},objtypes:{"0":"py:module","1":"py:function","2":"py:class","3":"py:method"},terms:{"boolean":0,"byte":0,"case":0,"class":0,"default":0,"float":0,"function":0,"import":0,"int":0,"new":0,"return":0,"true":0,For:0,Its:0,THe:0,The:0,Use:0,about:0,access:0,accord:0,across:0,add:0,add_stack_to_writ:0,added:0,adher:0,after:0,again:0,against:0,all:0,allow:0,allowa:0,alreadi:0,also:0,amost:0,ani:0,anoth:0,api:0,appear:0,append:0,append_data_to_stack:0,appli:0,apply_geometry_from_fil:0,apply_geometry_from_pixel_map:0,are_stacks_initi:[],argument:0,arrai:0,assign:0,attempt:0,attribut:0,automat:0,axes:0,backcspad:0,base:0,beam:0,been:0,befor:0,block:0,bool:0,brace:0,bracket:0,buffer:0,build:0,can:0,cannot:0,cbf_obj:0,cbfimag:0,center:0,cfel:0,cfel_crystfel:2,cfel_cxi:2,cfel_fabio:2,cfel_geom:2,cfel_hdf5:2,cfel_optarg:2,cfel_psana:2,cfelfabio:0,cfelgeom:0,cfelhdf5:0,cfeloptarg:0,cfelpsana:0,chang:0,characterist:0,check:0,choic:0,chuck:0,chunk:0,chunk_siz:0,close:0,close_fil:0,command:0,compress:0,comput:0,config:0,configpars:0,configur:0,contain:0,content:[1,2],convers:0,convert:0,coordin:0,corner:0,correct:0,count:0,counter1:0,counter2:0,cours:0,cover:0,creat:0,create_link:0,create_link_to_group:0,crystfel:0,crystfel_geometri:0,cxi:0,cxidb:0,cxiwrit:0,cxix:0,data:0,data_as_slab:0,data_filenam:0,data_group:0,defin:0,delet:0,describ:0,detector1:0,detector2:0,detector:0,detector_1:0,detectorname1:0,detectorname2:0,determin:0,dict:0,dictionari:0,directori:0,dirnam:0,dirname_from_source_run:0,distanc:0,document:0,doubl:0,dtype:0,dure:0,each:0,end:0,ensur:0,entri:0,entry_1:0,error:0,etc:0,event:0,exampl:0,exist:0,exp:0,expand:0,extract:0,fabio:0,fals:0,file:0,file_is_ful:0,filenam:0,first:0,fix:0,fnam:0,follow:0,form:0,format:0,frame:0,from:0,frontcspad:0,full:0,further:0,gener:0,geometri:0,geometry_filenam:0,get:0,get_detector_geometry_2:0,get_file_handl:0,group:0,h5py:0,handl:0,has:0,have:0,hdf5:0,hold:0,html:0,http:0,identifi:0,im_out:0,imag:0,imageview:0,img_shap:0,implement:0,index:1,inform:0,initi:0,initial_data:0,initialize_stack:0,input:0,inspect:0,instanc:0,instanti:0,instead:0,integ:0,interact:0,intern:0,interoper:0,interpret:0,keep:0,kei:0,layout:0,left:0,level:0,like:0,line:0,link:0,list:0,load:0,load_crystfel_geometri:0,load_nparray_from_hdf5_fil:0,locat:0,low:0,make:0,manag:0,mani:0,manual:0,map:0,match:0,max_num_slic:0,maximum:0,miss:0,mod:0,modul:[1,2],monitor_param:0,more:0,multi:0,must:0,nake:0,name:0,ndarrai:0,need:0,never:0,next:0,non:0,none:0,nonetyp:0,normal:0,nparrai:0,number:0,number_of_entri:0,numpi:0,object:0,onc:0,one:0,onli:0,open:0,oper:0,oppos:0,option:0,order:0,org:0,origin:0,otherwis:0,out:0,output:0,overwrit:0,overwritten:0,own:0,p11:0,packag:2,page:1,paramet:0,pars:0,parse_paramet:0,parser:0,path:0,payload:0,petraiii:0,physic:0,pixel:0,pixel_maps_for_image_view:0,pixel_maps_from_geometry_fil:0,point:0,prefix:0,previou:0,print:0,process:0,project:0,provid:0,psana:0,psana_event_inspect:0,psana_obj_from_str:0,pyqtgraph:0,python:0,quot:0,rai:0,rais:0,rand:0,random:0,rang:[],rawconfigpars:0,read:0,read_cbf_from_stream:0,receiv:0,refer:0,reimplement:0,relev:0,replac:0,represent:0,reset:0,respect:0,risk:0,rule:0,same:0,search:1,see:0,sender:0,set:0,sever:0,shape:0,simpl:0,singl:0,size:0,slab:0,slab_shap:0,slice:0,softwar:0,sourc:0,specifi:0,squar:0,stack:0,stacks_are_initi:0,start:0,statu:0,str:0,stream:0,string:0,structur:0,style:0,subdirectori:0,submodul:2,subsequ:0,succe:0,sure:0,sync:0,synchron:0,system:0,take:0,test1:0,test2:0,tfel:0,than:0,thei:0,them:0,thi:0,time:0,top:0,tri:0,tupl:0,turn:0,type:0,uncorrect:0,union:0,unless:0,usag:0,use:0,used:0,user:0,using:0,util:0,valid:0,valu:0,verbatim:0,visual:0,wai:0,want:0,what:0,where:0,which:0,widget:0,without:0,word:0,work:0,write:0,write_simple_entri:0,write_slice_and_incr:0,write_stack_slice_and_incr:0,writer:0,written:0,www:0,your:0},titles:["cfelpyutils package","Welcome to cfelpyutils’s documentation!","cfelpyutils"],titleterms:{cfel_crystfel:0,cfel_cxi:0,cfel_fabio:0,cfel_geom:0,cfel_hdf5:0,cfel_optarg:0,cfel_psana:0,cfelfabio:[],cfelgeom:[],cfelhdf5:[],cfeloptarg:[],cfelpsana:[],cfelpyutil:[0,1,2],content:0,document:1,indic:1,modul:0,packag:0,submodul:0,tabl:1,welcom:1}}) \ No newline at end of file +Search.setIndex({docnames:["cfelpyutils","index","modules"],envversion:53,filenames:["cfelpyutils.rst","index.rst","modules.rst"],objects:{"":{cfelpyutils:[0,0,0,"-"]},"cfelpyutils.cfel_crystfel":{load_crystfel_geometry:[0,1,1,""]},"cfelpyutils.cfel_cxi":{CXIWriter:[0,2,1,""]},"cfelpyutils.cfel_cxi.CXIWriter":{add_stack_to_writer:[0,3,1,""],append_data_to_stack:[0,3,1,""],close_file:[0,3,1,""],create_link:[0,3,1,""],create_link_to_group:[0,3,1,""],file_is_full:[0,3,1,""],get_file_handle:[0,3,1,""],initialize_stacks:[0,3,1,""],is_entry_in_file:[0,3,1,""],num_slices_in_file:[0,3,1,""],stacks_are_initialized:[0,3,1,""],write_simple_entry:[0,3,1,""],write_stack_slice_and_increment:[0,3,1,""]},"cfelpyutils.cfel_fabio":{read_cbf_from_stream:[0,1,1,""]},"cfelpyutils.cfel_geom":{ImageShape:[0,2,1,""],PixelMaps:[0,2,1,""],apply_geometry_from_file:[0,1,1,""],apply_geometry_from_pixel_maps:[0,1,1,""],get_image_shape:[0,1,1,""],pixel_maps_for_image_view:[0,1,1,""],pixel_maps_from_geometry_file:[0,1,1,""]},"cfelpyutils.cfel_geom.ImageShape":{fs:[0,4,1,""],ss:[0,4,1,""]},"cfelpyutils.cfel_geom.PixelMaps":{r:[0,4,1,""],x:[0,4,1,""],y:[0,4,1,""]},"cfelpyutils.cfel_hdf5":{load_nparray_from_hdf5_file:[0,1,1,""]},"cfelpyutils.cfel_optarg":{parse_parameters:[0,1,1,""]},"cfelpyutils.cfel_psana":{dirname_from_source_runs:[0,1,1,""],psana_event_inspection:[0,1,1,""],psana_obj_from_string:[0,1,1,""]},cfelpyutils:{cfel_crystfel:[0,0,0,"-"],cfel_cxi:[0,0,0,"-"],cfel_fabio:[0,0,0,"-"],cfel_geom:[0,0,0,"-"],cfel_hdf5:[0,0,0,"-"],cfel_optarg:[0,0,0,"-"],cfel_psana:[0,0,0,"-"]}},objnames:{"0":["py","module","Python module"],"1":["py","function","Python function"],"2":["py","class","Python class"],"3":["py","method","Python method"],"4":["py","attribute","Python attribute"]},objtypes:{"0":"py:module","1":"py:function","2":"py:class","3":"py:method","4":"py:attribute"},terms:{"boolean":0,"byte":0,"case":0,"class":0,"default":0,"float":0,"function":0,"import":0,"int":0,"new":0,"return":0,"true":0,For:0,Its:0,THe:0,The:0,Use:0,about:0,access:0,accord:0,across:0,add:0,add_stack_to_writ:0,added:0,adher:0,after:0,again:0,against:0,alia:0,all:0,allow:0,allowa:0,alreadi:0,also:0,amost:0,ani:0,anoth:0,api:0,appear:0,append:0,append_data_to_stack:0,appli:0,apply_geometry_from_fil:0,apply_geometry_from_pixel_map:0,argument:0,arrai:0,assign:0,attempt:0,attribut:0,automat:0,axes:0,backcspad:0,base:0,beam:0,been:0,befor:0,block:0,bool:0,brace:0,bracket:0,buffer:0,build:0,can:0,cannot:0,cbf_obj:0,cbfimag:0,center:0,cfel:0,cfel_crystfel:2,cfel_cxi:2,cfel_fabio:2,cfel_geom:2,cfel_hdf5:2,cfel_optarg:2,cfel_psana:2,cfelfabio:0,cfelgeom:0,cfelhdf5:0,cfeloptarg:0,cfelpsana:0,chang:0,characterist:0,check:0,choic:0,chuck:0,chunk:0,chunk_siz:0,close:0,close_fil:0,command:0,compress:0,comput:0,config:0,configpars:0,configur:0,contain:0,content:[1,2],convers:0,convert:0,coordin:0,corner:0,correct:0,count:0,counter1:0,counter2:0,cours:0,cover:0,creat:0,create_link:0,create_link_to_group:0,crystfel:0,crystfel_geometri:0,cxi:0,cxidb:0,cxiwrit:0,cxix:0,data:0,data_as_slab:0,data_filenam:0,data_group:0,dataset:0,defin:0,delet:0,describ:0,detector1:0,detector2:0,detector:0,detector_1:0,detectorname1:0,detectorname2:0,determin:0,dict:0,dictionari:0,directori:0,dirnam:0,dirname_from_source_run:0,distanc:0,document:0,doubl:0,dtype:0,dure:0,each:0,either:0,end:0,ensur:0,entri:0,entry_1:0,error:0,etc:0,event:0,exampl:0,exist:0,exp:0,expand:0,extract:0,fabio:0,fals:0,field:0,file:0,file_is_ful:0,filenam:0,first:0,fix:0,fnam:0,follow:0,form:0,format:0,found:0,frame:0,from:0,frontcspad:0,full:0,further:0,gener:0,geometri:0,geometry_filenam:0,get:0,get_detector_geometry_2:0,get_file_handl:0,get_image_shap:0,group:0,h5py:0,handl:0,has:0,have:0,hdf5:0,hit:0,hold:0,html:0,http:0,identifi:0,im_out:0,imag:0,imageshap:0,imageview:0,img_shap:0,implement:0,index:1,inform:0,initi:0,initial_data:0,initialize_stack:0,input:0,inspect:0,instanc:0,instanti:0,instead:0,integ:0,interact:0,intern:0,interoper:0,interpret:0,is_entry_in_fil:0,keep:0,kei:0,layout:0,left:0,level:0,like:0,line:0,link:0,list:0,load:0,load_crystfel_geometri:0,load_nparray_from_hdf5_fil:0,locat:0,low:0,make:0,manag:0,mani:0,manual:0,map:0,match:0,max_num_slic:0,maximum:0,minimum:0,miss:0,mod:0,modul:[1,2],monitor_param:0,more:0,multi:0,must:0,nake:0,name:0,ndarrai:0,need:0,never:0,next:0,non:0,none:0,nonetyp:0,normal:0,nparrai:0,num_slic:0,num_slices_in_fil:0,number:0,number_of_entri:0,numpi:0,object:0,onc:0,one:0,onli:0,open:0,oper:0,oppos:0,option:0,order:0,org:0,origin:0,otherwis:0,out:0,output:0,overwrit:0,overwritten:0,own:0,p11:0,packag:2,page:1,paramet:0,pars:0,parse_paramet:0,parser:0,path:0,payload:0,petraiii:0,physic:0,pixel:0,pixel_maps_for_image_view:0,pixel_maps_from_geometry_fil:0,pixelmap:0,point:0,prefix:0,present:0,previou:0,print:0,process:0,project:0,provid:0,psana:0,psana_event_inspect:0,psana_obj_from_str:0,pyqtgraph:0,python:0,quot:0,rai:0,rais:0,rand:0,random:0,rawconfigpars:0,read:0,read_cbf_from_stream:0,receiv:0,refer:0,reimplement:0,relev:0,replac:0,repres:0,represent:0,reset:0,respect:0,result:0,ret:0,risk:0,rule:0,same:0,search:1,see:0,sender:0,set:0,sever:0,shape:0,simpl:0,singl:0,size:0,slab:0,slice:0,softwar:0,sourc:0,specifi:0,squar:0,stack:0,stacks_are_initi:0,start:0,statu:0,str:0,stream:0,string:0,structur:0,style:0,subdirectori:0,submodul:2,subsequ:0,succe:0,sure:0,sync:0,synchron:0,system:0,take:0,test1:0,test2:0,tfel:0,than:0,thei:0,them:0,thi:0,time:0,top:0,tri:0,tupl:0,turn:0,type:0,union:0,unless:0,usag:0,use:0,used:0,user:0,using:0,util:0,valid:0,valu:0,verbatim:0,visual:0,wai:0,want:0,what:0,where:0,which:0,widget:0,without:0,word:0,work:0,write:0,write_simple_entri:0,write_slice_and_incr:0,write_stack_slice_and_incr:0,writer:0,written:0,writter:0,www:0,your:0},titles:["cfelpyutils package","Welcome to cfelpyutils\u2019s documentation!","cfelpyutils"],titleterms:{cfel_crystfel:0,cfel_cxi:0,cfel_fabio:0,cfel_geom:0,cfel_hdf5:0,cfel_optarg:0,cfel_psana:0,cfelpyutil:[0,1,2],content:0,document:1,indic:1,modul:0,packag:0,submodul:0,tabl:1,welcom:1}}) \ No newline at end of file -- GitLab