Source code for magni.afm.types.spectroscopy

"""
..
    Copyright (c) 2014-2017, Magni developers.
    All rights reserved.
    See LICENSE.rst for further information.

Module providing data container classes for .mi spectroscopy files.

The classes of this module can be used either directly or indirectly through
the `io` module by loading an .mi spectroscopy file.

Routine listings
----------------
Buffer(magni.afmtypes.BaseClass)
    Data class for .mi spectroscopy buffer.
Chunk(magni.afmtypes.BaseClass)
    Data class for .mi spectroscopy chunk.
Grid(magni.afmtypes.BaseClass)
    Data class for .mi spectroscopy grid.
Point(magni.afmtypes.BaseClass)
    Data class for .mi spectroscopy point.
Spectroscopy(magni.afm.types.File)
    Data class for .mi spectroscopy.

See Also
--------
magni.afm.io : .mi file loading.

"""

from __future__ import division
from collections import OrderedDict as _OrderedDict

import numpy as np

from magni.afm.types import BaseClass as _BaseClass
from magni.afm.types import File as _File
from magni.utils.validation import decorate_validation as _decorate_validation
from magni.utils.validation import validate_generic as _generic
from magni.utils.validation import validate_levels as _levels
from magni.utils.validation import validate_numeric as _numeric


[docs]class Buffer(_BaseClass): """ Data class of the .mi spectroscopy buffers. Parameters ---------- attrs : dict The attributes of the buffer. data : list or tuple The grids, points, or chunks of the buffer. Attributes ---------- data : numpy.ndarray The grids, points, or chunks of the buffer. See Also -------- magni.utils.types.BaseClass : Superclass of the present class. Examples -------- No example .mi spectroscopy file is distributed with magni. """ _params = _OrderedDict((('bufferLabel', str), ('bufferUnit', str))) def __init__(self, attrs, data): @_decorate_validation def validate_input(): _generic('attrs', 'mapping', has_keys=('bufferLabel',)) _levels('data', (_generic(None, 'explicit collection'), _generic(None, (Grid, Point, Chunk)))) _BaseClass.__init__(self, attrs) validate_input() self._data = tuple(data) data = property(lambda self: self._data)
[docs]class Chunk(_BaseClass): """ Data class of the .mi spectroscopy chunks. Parameters ---------- attrs : dict The attributes of the chunk. data : numpy.ndarray The data of the chunk. Attributes ---------- data : numpy.ndarray The data of the chunk. See Also -------- magni.utils.types.BaseClass : Superclass of the present class. Examples -------- No example .mi spectroscopy file is distributed with magni. """ _params = _OrderedDict((('index', int), ('samples', int), ('timeStart', float), ('timeDelta', float), ('sweepStart', float), ('sweepDelta', float), ('continuation', bool), ('label', str), ('pointIndex', int), ('curveIndex', int))) def __init__(self, attrs, data): @_decorate_validation def validate_input(): _generic('attrs', 'mapping', has_keys=('samples', 'timeStart', 'timeDelta', 'sweepStart', 'sweepDelta')) _numeric('data', 'floating', shape=(self.attrs['samples'],)) _BaseClass.__init__(self, attrs) validate_input() self._time = None self._sweep = None self._data = data self._data.flags['WRITEABLE'] = False data = property(lambda self: self._data) @property def sweep(self): """ Get the sweep property of the chunk. The sweep property is the series of the entity which was swept. Returns ------- sweep : numpy.ndarray The sweep property. Notes ----- To reduce the memory footprint of chunks, the series does not exist explicitly, until it is requested. """ if self._sweep is None: self._sweep = np.linspace( self.attrs['sweepStart'], self.attrs['sweepStart'] + (self.attrs['samples'] - 1) * self.attrs['sweepDelta'], self.attrs['samples']) self._sweep.flags['WRITEABLE'] = False return self._sweep @property def time(self): """ Get the time property of the chunk. Returns ------- time : numpy.ndarray The time property. Notes ----- To reduce the memory footprint of chunks, the series does not exist explicitly, until it is requested. """ if self._time is None: self._time = np.linspace( self.attrs['timeStart'], self.attrs['timeStart'] + (self.attrs['samples'] - 1) * self.attrs['timeDelta'], self.attrs['samples']) self._time.flags['WRITEABLE'] = False return self._time
[docs]class Grid(_BaseClass): """ Data class of the .mi spectroscopy grids. Parameters ---------- attrs : dict The attributes of the grid. points : list or tuple The points of the grid. Attributes ---------- points : tuple The points of the grid. See Also -------- magni.utils.types.BaseClass : Superclass of the present class. Notes ----- The points are input and output as a 2D tuple of Point instances. Examples -------- No example .mi spectroscopy file is distributed with magni. """ _params = _OrderedDict((('index', int), ('xCenter', float), ('yCenter', float), ('xPoints', int), ('yPoints', int), ('pointSpacing', float), ('angle', int), ('yDirection', str), ('xDirection', str))) def __init__(self, attrs, points): @_decorate_validation def validate_input(): _generic('attrs', 'mapping', has_keys=( 'xCenter', 'yCenter', 'xPoints', 'yPoints', 'pointSpacing')) _levels('points', (_generic(None, 'explicit collection', len_=self.attrs['yPoints']), _generic(None, 'explicit collection', len_=self.attrs['xPoints']), _generic(None, Point, ignore_none=True))) _BaseClass.__init__(self, attrs) validate_input() self._points = tuple(tuple(val) for val in points) points = property(lambda self: self._points)
[docs]class Point(_BaseClass): """ Data class of the .mi spectroscopy points. Parameters ---------- attrs : dict The attributes of the point. chunks : list or tuple, optional The chunks of the point. (the default is (), which implies no chunks) Attributes ---------- chunks : tuple The chunks of the point. See Also -------- magni.utils.types.BaseClass : Superclass of the present class. Examples -------- No example .mi spectroscopy file is distributed with magni. """ _params = _OrderedDict((('index', int), ('xCoordinate', float), ('yCoordinate', float))) def __init__(self, attrs, chunks=()): @_decorate_validation def validate_input(): _generic('attrs', 'mapping', has_keys=tuple(Point._params.keys())) _levels('chunks', (_generic(None, 'explicit collection'), _generic(None, Chunk))) _BaseClass.__init__(self, attrs) validate_input() self._chunks = tuple(chunks) chunks = property(lambda self: self._chunks)
[docs]class Spectroscopy(_File): """ Data class of the .mi spectroscopy files. Parameters ---------- attrs : dict The attributes of the image. buffers : list or tuple The buffers of the image. See Also -------- magni.utils.types.File : Superclass of the present class. Examples -------- No example .mi spectroscopy file is distributed with magni. """ _params = _OrderedDict((('plotType', str), ('BgImageFile', str))) def __init__(self, attrs, buffers): @_decorate_validation def validate_input(): _levels('buffers', (_generic(None, 'explicit collection'), _generic(None, Buffer))) _File.__init__(self, attrs, buffers) validate_input()