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)
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"], )
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"])
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))
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))
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))
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()
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")
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")
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")
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"))
"""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()))