Source code for refl1d.anstodata

# This program is in the public domain
# Author: Andrew Nelson
"""
ANSTO data loaders

The following instrument is defined::

    Platypus

All the ANSTO instruments emit Q/R/dR/dQ in their output files.
"""

import re
import os.path
import numpy as np

from bumps.data import maybe_open
from .probe import QProbe
from .resolution import FWHM2sigma


def _load_dat(f):
    """
    Loads a Platypus dataset from file. This will normally be Q, R, dR, dQ.

    | Q - Momentum transfer |1/Ang|
    | R - Reflectivity
    | dR - uncertainty in reflectivity (1 sigma)
    | dQ - FWHM of Gaussian resolution kernel.

    **Parameters**

    f : file-handle or string
        File to load the dataset from.

    **Returns**

    (filename, name, data) - str, str, tuple of np.ndarray
    """

    # it would be nice to use refl1d.probe.load4 directly. However,
    # there are lots of files in the wild that don't use # to denote comments
    # in the header. In addition, it is known that ANSTO datasets emit dQ as
    # FWHM.

    with maybe_open(f) as fh:
        fname = fh.name
        header_lines = 0
        for i, line in enumerate(fh):
            try:
                nums = [float(tok) for tok in re.split(r'\s|,', line)
                        if len(tok)]
            except ValueError:
                continue
            if len(nums) >= 2:
                header_lines = i
                break

    data = np.loadtxt(f, unpack=True, skiprows=header_lines)

    filename = fname
    name = os.path.splitext(os.path.basename(fname))[0]

    return filename, name, data


[docs] def load(filename, instrument=None, **kw): """ Return a probe for ANSTO data. **Parameters** f : file-handle or string File to load the dataset from. **Returns** probe : probe.QProbe """ fname, name, data = _load_dat(filename) Q = data[0] R = data[1] dR = data[2] dQ = FWHM2sigma(data[3]) probe = QProbe(Q, dQ, data=(R, dR), name=name, filename=fname) if instrument is not None: probe.instrument = instrument.instrument return probe
[docs] class ANSTOData(object):
[docs] def load(self, filename, **kw): return load(filename, instrument=self, **kw)
[docs] class Platypus(ANSTOData): """ Loader for reduced data from the ANSTO Platypus instrument. """ instrument = "Platypus" radiation = "neutron"
INSTRUMENTS = { 'Platypus': Platypus, }