示例#1
0
    def testWriter(self):
        '''test the writer.Writer class'''
        spec_data = spec.SpecDataFile(self.fname)
        out = writer.Writer(spec_data)
        scan_list = [1, 5, 7]
        out.save(self.hname, scan_list)

        dd = out.root_attributes()
        self.assertTrue(isinstance(dd, dict))

        # TODO: test writer's various functions and methods

        # test file written by Writer
        with h5py.File(self.hname, "r") as hp:
            root = hp["/"]
            default = root.attrs.get("default")
            self.assertNotEqual(default, None)
            self.assertTrue(default in root)
            nxentry = root[default]

            default = nxentry.attrs.get("default")
            self.assertNotEqual(default, None)
            self.assertTrue(default in nxentry)
            nxdata = nxentry[default]

            signal = nxdata.attrs.get("signal")
            self.assertNotEqual(signal, None)
            self.assertTrue(signal in nxdata)
示例#2
0
    def test_geometry_plugin(self):
        fname = os.path.join(_path, "spec2nexus", 'data', '33bm_spec.dat')
        scan_number = 17
        sdf = spec.SpecDataFile(fname)
        scan = sdf.getScan(scan_number)

        self.assertEqual(scan.diffractometer.geometry_name_full,
                         "fourc.default")
        self.assertEqual(scan.diffractometer.mode, "Omega equals zero")
        self.assertEqual(scan.diffractometer.sector, 0)
        self.assertIsNotNone(scan.diffractometer.lattice)
        self.assertEqual(len(scan.diffractometer.reflections), 2)

        out = writer.Writer(sdf)
        out.save(self.hname, [scan_number])

        with h5py.File(self.hname, "r") as hp:
            nxentry = hp["/S17"]
            group = nxentry["instrument/geometry_parameters"]

            self.assertIn("instrument/name", nxentry)
            self.assertEqual(nxentry["instrument/name"][0],
                             scan.diffractometer.geometry_name_full.encode())
            self.assertIn("diffractometer_simple", group)
            self.assertEqual(group["diffractometer_simple"][0], b"fourc")
            self.assertIn("diffractometer_full", group)
            self.assertEqual(group["diffractometer_full"][0], b"fourc.default")
            self.assertIn("diffractometer_variant", group)
            self.assertEqual(group["diffractometer_variant"][0], b"default")

            for k in "g_aa g_bb g_cc g_al g_be g_ga LAMBDA".split():
                self.assertIn(k, group)
                v = group[k][()][0]
                self.assertGreater(v, 0)

            self.assertIn("sample/unit_cell_abc", nxentry)
            self.assertIn("sample/unit_cell_alphabetagamma", nxentry)
            self.assertIn("sample/unit_cell", nxentry)

            self.assertIn("sample/ub_matrix", nxentry)
            ds = nxentry["sample/ub_matrix"]
            self.assertTupleEqual(ds.shape, (3, 3))

            self.assertIn("sample/or0", nxentry)
            self.assertIn("sample/or0/h", nxentry)
            self.assertIn("sample/or0/k", nxentry)
            self.assertIn("sample/or0/l", nxentry)
            self.assertIn("sample/or1", nxentry)
            self.assertIn("sample/or1/h", nxentry)
            self.assertIn("sample/or1/k", nxentry)
            self.assertIn("sample/or1/l", nxentry)

            self.assertIn("instrument/monochromator/wavelength", nxentry)
            self.assertIn("sample/beam/incident_wavelength", nxentry)
            self.assertEqual(
                nxentry["instrument/monochromator/wavelength"],
                nxentry["sample/beam/incident_wavelength"],
            )
示例#3
0
    def test_contents(self):
        spec_data = SpecDataFile(self.fname)
        self.assertTrue(isinstance(spec_data, SpecDataFile))
        out = writer.Writer(spec_data)
        scan_list = [
            1,
        ]
        out.save(self.hname, scan_list)

        # text that UXML group defined as expected
        self.assertTrue(os.path.exists(self.hname))
        with h5py.File(self.hname) as h5_file:
            self.assertTrue("S1" in h5_file)
            nxentry = h5_file["/S1"]
            self.assertTrue("UXML" in nxentry)
            uxml = nxentry["UXML"]
            self.assertTrue("NX_class" in uxml.attrs)
            self.assertEqual(uxml.attrs["NX_class"], "NXnote")

            # spot-check a couple items
            # group: attenuator_set
            self.assertTrue("attenuator_set" in uxml)
            group = uxml["attenuator_set"]
            prefix = group.attrs.get("prefix")
            description = group.attrs.get("description")
            unique_id = group.attrs.get("unique_id")
            self.assertEqual(prefix, "33idd:filter:")
            self.assertEqual(description, "33-ID-D Filters")
            self.assertEqual(unique_id, None)

            # <dataset name="corrdet_counter">corrdet</dataset>
            self.assertTrue("corrdet_counter" in group)
            ds = group["corrdet_counter"]
            # http://docs.h5py.org/en/stable/whatsnew/2.1.html?highlight=dataset#dataset-value-property-is-now-deprecated
            value = ds[()]  # ds.value deprecated in h5py
            self.assertEqual(value, [b"corrdet"])

            # <dataset name="wait_time" type="float" units="s">0.500</dataset>
            self.assertTrue("wait_time" in group)
            ds = group["wait_time"]
            attrs = dict(ds.attrs)
            self.assertEqual(ds.attrs.get("units"), "s")
            value = ds[()]  # ds.value deprecated in h5py
            self.assertEqual(value, numpy.array([.5]))

            # <hardlink name="attenuator1" target_id="33idd:filter:Fi1:"/>
            self.assertTrue("attenuator1" in group)
            attenuator1 = group["attenuator1"]
            target = attenuator1.attrs.get("target")
            self.assertNotEqual(target, attenuator1.name)
            self.assertEqual(target, uxml["attenuator1"].name)

            addr = "/S1/UXML/ad_file_info/file_format"
            self.assertTrue(addr in h5_file)
            ds = h5_file[addr]
            value = ds[()]  # ds.value deprecated in h5py
            self.assertEqual(value, [b"TIFF"])
示例#4
0
 def testWriter(self):
     '''test the writer.Writer class'''
     spec_data = spec.SpecDataFile(self.fname)
     out = writer.Writer(spec_data)
     scan_list = [1, 5, 7]
     out.save(self.hname, scan_list)
     # TODO: make tests of other things in the Writer
     dd = out.root_attributes()
     self.assertTrue(isinstance(dd, dict))
    def test_the_data_file(self):
        '''
        write all as HDF5: 1-D scans, USAXS scans, Fly scans, #O+#o and #J+#j control lines
        '''
        prefix = os.path.abspath(
            os.path.join(_path, 'spec2nexus', 'data', '03_06_JanTest'))
        file1 = prefix + '.dat'
        hfile = tests.common.create_test_file()

        # writer interface has changed, must use new spec module to proceed
        specfile = spec.SpecDataFile(file1)
        self.assertTrue(isinstance(specfile, spec2nexus.spec.SpecDataFile),
                        file1)

        specwriter = writer.Writer(specfile)
        self.assertTrue(isinstance(specwriter, spec2nexus.writer.Writer),
                        file1)

        specwriter.save(hfile, sorted(specfile.getScanNumbers()))
        self.assertTrue(os.path.exists(hfile))

        def subgroup_list(parent, nxclass):
            children = []
            for item in sorted(parent):
                obj = parent[item]
                if isinstance(obj, h5py.Group):
                    if obj.attrs.get('NX_class', '') == nxclass:
                        children.append(obj)
            return children

        fp = h5py.File(hfile, 'r')
        self.assertTrue(isinstance(fp, h5py.File), hfile)
        nxentry_groups = subgroup_list(fp, 'NXentry')
        self.assertGreater(len(nxentry_groups), 0)
        for nxentry in nxentry_groups:
            nxdata_groups = subgroup_list(nxentry, 'NXdata')
            self.assertGreater(len(nxdata_groups), 0)
            for nxdata in nxdata_groups:
                signal = nxdata.attrs.get('signal')
                self.assertTrue(signal in nxdata)

        default = fp.attrs.get('default')
        self.assertTrue(default in fp)
        nxentry = fp[default]

        default = nxentry.attrs.get('default')
        self.assertTrue(default in nxentry)
        nxdata = nxentry[default]

        signal = nxdata.attrs.get('signal')
        self.assertTrue(signal in nxdata)

        fp.close()

        os.remove(hfile)
        self.assertFalse(os.path.exists(hfile))
示例#6
0
    def test_the_data_file(self):
        '''
        look for the metadata
        '''
        prefix = os.path.abspath(
            os.path.join(_path, 'spec2nexus', 'data',
                         'usaxs-bluesky-specwritercallback'))
        file1 = prefix + '.dat'
        hfile = tests.common.create_test_file()

        # writer interface has changed, must use new spec module to proceed
        specfile = spec.SpecDataFile(file1)
        self.assertTrue(isinstance(specfile, spec2nexus.spec.SpecDataFile),
                        file1)

        for scan_num, scan in specfile.scans.items():
            msg = "Scan %s MD test" % scan_num
            scan.interpret()  # force lazy-loader to parse this scan
            self.assertTrue(hasattr(scan, "MD"), msg)
            self.assertTrue(isinstance(scan.MD, OrderedDict), msg)
            self.assertGreater(len(scan.MD), 0, msg)

        # test the metadata in a NeXus file

        specwriter = writer.Writer(specfile)
        self.assertTrue(isinstance(specwriter, spec2nexus.writer.Writer),
                        file1)

        specwriter.save(hfile, sorted(specfile.getScanNumbers()))
        self.assertTrue(os.path.exists(hfile))

        def subgroup_list(parent, nxclass):
            children = []
            for item in sorted(parent):
                obj = parent[item]
                if isinstance(obj, h5py.Group):
                    if obj.attrs.get('NX_class', '') == nxclass:
                        children.append(obj)
            return children

        fp = h5py.File(hfile, 'r')
        for nxentry in subgroup_list(fp, 'NXentry'):
            # nxinstrument_groups = subgroup_list(nxentry, 'NXinstrument')
            # self.assertEqual(len(nxinstrument_groups), 1)
            # nxinstrument = nxinstrument_groups[0]

            nxcollection_groups = subgroup_list(nxentry, 'NXcollection')
            self.assertGreater(len(nxcollection_groups), 0)
            md_group = nxentry.get("bluesky_metadata")
            self.assertIsNotNone(md_group, "bluesky_metadata in NeXus file")

        fp.close()

        os.remove(hfile)
        self.assertFalse(os.path.exists(hfile))
示例#7
0
 def testName(self):
     spec_data = SpecDataFile(self.fname)
     self.assertTrue(isinstance(spec_data, SpecDataFile))
     out = writer.Writer(spec_data)
     scan_list = [
         1,
     ]
     out.save(self.hname, scan_list)
     # TODO: make tests of other things in the Writer
     dd = out.root_attributes()
     self.assertTrue(isinstance(dd, dict))
示例#8
0
    def test_data_file(self):
        self.assertTrue(os.path.exists(self.testfile))

        specfile = spec2nexus.spec.SpecDataFile(self.testfile)
        scanNum = 1
        scan = specfile.getScan(scanNum)

        # issue #137 & #140
        try:
            u = scan.__getattribute__("U")
        except AttributeError:
            u = None
        self.assertNotEqual(u, None, "U attribute lazy loaded")
        # not needed: scan.interpret()
        self.assertTrue(hasattr(scan, "U"), "#U in scan #1")
        self.assertEqual(len(scan.U), 1, "only one #U in scan #1")

        self.assertTrue(hasattr(scan.header, "U"), "#U in scan header")
        self.assertEqual(len(scan.header.U), 1, "only one #U in header")

        # test for UserReserved in a NeXus file

        specwriter = writer.Writer(specfile)
        specwriter.save(self.hfile, "1 2 3 4 5".split())
        self.assertTrue(os.path.exists(self.hfile))

        fp = h5py.File(self.hfile, 'r')
        entry = fp.get("/S1")
        self.assertIsNot(entry, None, "group /S1")
        u = entry.get("UserReserved")
        self.assertNotEqual(u, None, "group /S1/UserReserved")
        self.assertNotEqual(u.get("header_1"), None,
                            "dataset /S1/UserReserved/header_1")
        self.assertEqual(u.get("header_2"), None,
                         "dataset /S1/UserReserved/header_2")
        self.assertNotEqual(u.get("item_1"), None,
                            "dataset /S1/UserReserved/item_1")
        self.assertEqual(u.get("item_2"), None,
                         "dataset /S1/UserReserved/item_2")

        entry = fp.get("/S2")
        self.assertIsNot(entry, None, "group /S2")
        u = entry.get("UserReserved")
        self.assertNotEqual(u, None, "group /S2/UserReserved")
        self.assertNotEqual(u.get("header_1"), None,
                            "dataset /S1/UserReserved/header_1")
        self.assertEqual(u.get("header_2"), None,
                         "dataset /S1/UserReserved/header_2")
        self.assertEqual(u.get("item_1"), None,
                         "dataset /S1/UserReserved/item_1")
        self.assertEqual(u.get("item_2"), None,
                         "dataset /S1/UserReserved/item_2")
        fp.close()
示例#9
0
    def test_save_data_hklmesh(self):
        #S 17  hklmesh  H 1.9 2.1 100  K 1.9 2.1 100  -800000
        fname = os.path.join(_path, "spec2nexus", 'data', '33bm_spec.dat')
        hname = "test.h5"
        spec_data = spec.SpecDataFile(fname)
        out = writer.Writer(spec_data)
        out.save(hname, [17])

        with h5py.File(hname, "r") as hp:
            root = hp["/"]
            nxdata = root["/S17/data"]
            signal = nxdata.attrs["signal"]
            axes = nxdata.attrs["axes"]
            self.assertEqual(axes[0], b"H")
            self.assertEqual(axes[1], b"K")
示例#10
0
    def test_save_data_lscan(self):
        # hklscan moving L
        test_file = '33bm_spec.dat'
        scan_number = 14

        fname = os.path.join(_path, "spec2nexus", 'data', test_file)
        hname = "test.h5"
        spec_data = spec.SpecDataFile(fname)
        out = writer.Writer(spec_data)
        out.save(hname, [scan_number])

        with h5py.File(hname, "r") as hp:
            root = hp["/"]
            nxdata = root["/S%d/data" % scan_number]
            signal = nxdata.attrs["signal"]
            axes = nxdata.attrs["axes"]
            self.assertEqual(signal, "signal")
            self.assertEqual(axes, "L")
示例#11
0
    def test_save_data_mesh(self):
        #S 22  mesh  eta 57 57.1 10  chi 90.9 91 10  1
        fname = os.path.join(_path, "spec2nexus", 'data', '33id_spec.dat')
        hname = "test.h5"
        spec_data = spec.SpecDataFile(fname)
        out = writer.Writer(spec_data)
        out.save(hname, [22])

        with h5py.File(hname, "r") as hp:
            root = hp["/"]
            nxdata = root["/S22/data"]
            signal = nxdata.attrs["signal"]
            self.assertEqual(nxdata[signal][()].shape, (11, 11))

            ds = nxdata["_mca_"]
            self.assertEqual(ds[()].shape, (11, 11, 91))
            self.assertEqual(ds.attrs["axes"], "eta:chi:_mca_channel_")
            self.assertEqual(ds.attrs["spec_name"], "_mca_")
            self.assertEqual(ds.attrs["units"], "counts")
示例#12
0
    def test_contents(self):
        spec_data = SpecDataFile(self.fname)
        self.assertTrue(isinstance(spec_data, SpecDataFile))
        out = writer.Writer(spec_data)
        scan_list = [
            1,
        ]
        out.save(self.hname, scan_list)

        # the ONLY structural difference between test_3.spec
        # and test_4.spec is the presence of this hardlink
        self.assertTrue(os.path.exists(self.hname))
        with h5py.File(self.hname) as h5_file:
            source = h5_file["/S1/UXML/ad_detector/beam_center_x"]
            link = h5_file["/S1/UXML/beam_center_x"]
            target = source.attrs.get("target")

            self.assertNotEqual(source.name, link.name)
            self.assertNotEqual(target, None)
            self.assertEqual(target, source.name)
            self.assertEqual(target, link.attrs.get("target"))
示例#13
0
"""Process specific data file(s)"""

# TODO: fold into the unit test suite


import os
import sys
sys.path.insert(0, os.path.abspath("../src"))
from spec2nexus import writer
from spec2nexus import spec


if __name__ == '__main__':
    pwd = os.path.abspath(os.path.join("..", "src", "spec2nexus"))
    prefix = os.path.abspath(os.path.join(pwd, 'data', 'APS_spec_data'))
    # file1 = prefix + '.dat'
    hfile = prefix + '.hdf5'
    # # lmn40.spe has two header sections, 2nd is just before "#S 8"
    # prefix = os.path.abspath(os.path.join(pwd, 'data', 'lmn40'))
    # file1 = prefix + '.spe'

    # CdOsO has four header sections and two #S 1 scans
    prefix = os.path.abspath(os.path.join(pwd, 'data', 'CdOsO'))
    file1 = prefix

    # writer interface has changed, must use new spec module to proceed
    specfile = spec.SpecDataFile(file1)
    writer = writer.Writer(specfile)
    writer.save(hfile, sorted(specfile.getScanNumbers()))