source: sasview/test/sasdataloader/test/utest_cansas.py @ 9c0f3c17

ESS_GUIESS_GUI_DocsESS_GUI_batch_fittingESS_GUI_bumps_abstractionESS_GUI_iss1116ESS_GUI_iss879ESS_GUI_iss959ESS_GUI_openclESS_GUI_orderingESS_GUI_sync_sascalccostrafo411magnetic_scattrelease-4.2.2ticket-1009ticket-1094-headlessticket-1242-2d-resolutionticket-1243ticket-1249ticket885unittest-saveload
Last change on this file since 9c0f3c17 was 9c0f3c17, checked in by Ricardo Ferraz Leal <ricleal@…>, 7 years ago

After merge conflict

  • Property mode set to 100644
File size: 12.6 KB
RevLine 
[4bdd4fdb]1"""
2    Unit tests for the new recursive cansas reader
3"""
[b699768]4import sas.sascalc.dataloader.readers.cansas_reader as cansas
5from sas.sascalc.dataloader.loader import Loader
[d72567e]6from sas.sascalc.dataloader.data_info import Data1D, Data2D
[b699768]7from sas.sascalc.dataloader.readers.xml_reader import XMLreader
8from sas.sascalc.dataloader.readers.cansas_reader import Reader
9from sas.sascalc.dataloader.readers.cansas_constants import CansasConstants
[4bdd4fdb]10
11import os
12import sys
[eda8972]13import urllib2
14import StringIO
[ac5b69d]15import pylint as pylint
16import unittest
[9a5097c]17import numpy as np
[d72567e]18import logging
19import warnings
[4bdd4fdb]20
21from lxml import etree
[ea67541]22from xml.dom import minidom
[d72567e]23
[463e7ffc]24logger = logging.getLogger(__name__)
[c155a16]25
[d72567e]26warnings.simplefilter("ignore")
27
[ac5b69d]28CANSAS_FORMAT = CansasConstants.CANSAS_FORMAT
29CANSAS_NS = CansasConstants.CANSAS_NS
[d72567e]30
31class cansas_reader_xml(unittest.TestCase):
32
[4bdd4fdb]33    def setUp(self):
34        self.loader = Loader()
[eda8972]35        self.xml_valid = "cansas_test_modified.xml"
36        self.xml_invalid = "cansas_test.xml"
37        self.cansas1d_badunits = "cansas1d_badunits.xml"
38        self.cansas1d = "cansas1d.xml"
39        self.cansas1d_slit = "cansas1d_slit.xml"
40        self.cansas1d_units = "cansas1d_units.xml"
[83b6408]41        self.cansas1d_notitle = "cansas1d_notitle.xml"
[eda8972]42        self.isis_1_0 = "ISIS_1_0.xml"
43        self.isis_1_1 = "ISIS_1_1.xml"
44        self.isis_1_1_notrans = "ISIS_1_1_notrans.xml"
[76cd1ae]45        self.isis_1_1_doubletrans = "ISIS_1_1_doubletrans.xml"
[eda8972]46        self.schema_1_0 = "cansas1d_v1_0.xsd"
47        self.schema_1_1 = "cansas1d_v1_1.xsd"
[d72567e]48
49
[eda8972]50    def get_number_of_entries(self, dictionary, name, i):
51        if dictionary.get(name) is not None:
52            i += 1
53            name = name.split("_")[0]
54            name += "_{0}".format(i)
55            name = self.get_number_of_entries(dictionary, name, i)
56        return name
[d72567e]57
58
[3241dd2]59    def test_invalid_xml(self):
60        """
[c155a16]61        Should fail gracefully and send a message to logger.info()
[3241dd2]62        """
63        invalid = StringIO.StringIO('<a><c></b></a>')
64        reader = XMLreader(invalid)
[d72567e]65
[eda8972]66
67    def test_xml_validate(self):
68        string = "<xsd:schema xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">\n"
69        string += "\t<xsd:element name=\"a\" type=\"AType\"/>\n"
70        string += "\t<xsd:complexType name=\"AType\">\n"
71        string += "\t\t<xsd:sequence>\n"
72        string += "\t\t\t<xsd:element name=\"b\" type=\"xsd:string\" />\n"
73        string += "\t\t</xsd:sequence>\n"
74        string += "\t</xsd:complexType>\n"
75        string += "</xsd:schema>"
76        f = StringIO.StringIO(string)
77        xmlschema_doc = etree.parse(f)
78        xmlschema = etree.XMLSchema(xmlschema_doc)
79        valid = etree.parse(StringIO.StringIO('<a><b></b></a>'))
80        invalid = etree.parse(StringIO.StringIO('<a><c></c></a>'))
81        self.assertTrue(xmlschema.validate(valid))
82        self.assertFalse(xmlschema.validate(invalid))
[d72567e]83
84
[eda8972]85    def test_real_xml(self):
86        reader = XMLreader(self.xml_valid, self.schema_1_0)
[ac5b69d]87        valid = reader.validate_xml()
[eda8972]88        if valid:
89            self.assertTrue(valid)
90        else:
91            self.assertFalse(valid)
[d72567e]92
93
[76cd1ae]94    def _check_data(self, data):
95        self.assertTrue(data.title == "TK49 c10_SANS")
96        self.assertTrue(data.x.size == 138)
[ea67541]97        self.assertTrue(len(data.meta_data) == 3)
[76cd1ae]98        self.assertTrue(data.detector[0].distance_unit == "mm")
99        self.assertTrue(data.detector[1].distance_unit == "mm")
100        self.assertTrue(data.detector[0].name == "HAB")
101        self.assertTrue(data.detector[1].name == "main-detector-bank")
102        self.assertTrue(data.detector[0].distance == 575.0)
[250fec92]103        self.assertAlmostEqual(data.detector[1].distance, 4145.02)
[76cd1ae]104        self.assertTrue(data.process[0].name == "Mantid generated CanSAS1D XML")
[2e3b055]105        self.assertTrue(data.meta_data["xmlpreprocess"] != None)
[d72567e]106
107
[c6ca23d]108    def _check_data_1_1(self, data):
109        spectrum = data.trans_spectrum[0]
110        self.assertTrue(len(spectrum.wavelength) == 138)
[d72567e]111
112
[eda8972]113    def test_cansas_xml(self):
[75eeb425]114        filename = "isis_1_1_write_test.xml"
[eda8972]115        xmlreader = XMLreader(self.isis_1_1, self.schema_1_1)
[ac5b69d]116        valid = xmlreader.validate_xml()
117        xmlreader.set_processing_instructions()
[eda8972]118        self.assertTrue(valid)
[2e3b055]119        fo = open(self.isis_1_1)
120        str = fo.read()
[76cd1ae]121        reader_generic = Loader()
122        dataloader = reader_generic.load(self.isis_1_1)
123        reader_cansas = Reader()
124        cansasreader = reader_cansas.read(self.isis_1_1)
125        for i in range(len(dataloader)):
126            self._check_data(dataloader[i])
[c6ca23d]127            self._check_data_1_1(dataloader[i])
[76cd1ae]128            self._check_data(cansasreader[i])
[c6ca23d]129            self._check_data_1_1(cansasreader[i])
[76cd1ae]130            reader_generic.save(filename, dataloader[i], None)
[2e3b055]131            fo = open(filename)
132            str = fo.read()
133            reader2 = Loader()
134            return_data = reader2.load(filename)
[76cd1ae]135            written_data = return_data[0]
136            self._check_data(written_data)
[d72567e]137
138
[76cd1ae]139    def test_double_trans_spectra(self):
140        xmlreader = XMLreader(self.isis_1_1_doubletrans, self.schema_1_1)
[ac5b69d]141        self.assertTrue(xmlreader.validate_xml())
[76cd1ae]142        reader = Loader()
143        data = reader.load(self.isis_1_1_doubletrans)
144        for item in data:
145            self._check_data(item)
[d72567e]146
147
[eda8972]148    def test_entry_name_recurse(self):
149        test_values = [1,2,3,4,5,6]
150        base_key = "key"
151        d = {}
152        for value in test_values:
153            new_key = self.get_number_of_entries(d, base_key, i = 0)
154            d[new_key] = value
155        self.assertTrue(len(d) == 6)
[d72567e]156
157
[eda8972]158    def test_load_cansas_file(self):
159        valid = []
160        reader1 = XMLreader(self.xml_valid, self.schema_1_0)
[ac5b69d]161        self.assertTrue(reader1.validate_xml())
[eda8972]162        reader2 = XMLreader(self.xml_invalid, self.schema_1_0)
[ac5b69d]163        self.assertFalse(reader2.validate_xml())
[eda8972]164        reader3 = XMLreader(self.xml_valid, self.schema_1_1)
[ac5b69d]165        self.assertFalse(reader3.validate_xml())
[eda8972]166        reader4 = XMLreader(self.xml_invalid, self.schema_1_1)
[ac5b69d]167        self.assertFalse(reader4.validate_xml())
[eda8972]168        reader5 = XMLreader(self.isis_1_0, self.schema_1_0)
[ac5b69d]169        self.assertTrue(reader5.validate_xml())
[eda8972]170        reader6 = XMLreader(self.isis_1_1, self.schema_1_1)
[ac5b69d]171        self.assertTrue(reader6.validate_xml())
[eda8972]172        reader7 = XMLreader(self.isis_1_1, self.schema_1_0)
[ac5b69d]173        self.assertFalse(reader7.validate_xml())
[d72567e]174
175
[83b6408]176    def test_invalid_cansas(self):
177        list = self.loader.load(self.cansas1d_notitle)
178        data = list[0]
179        self.assertTrue(data.x.size == 2)
[1686a333]180        self.assertTrue(len(data.meta_data) == 2)
[83b6408]181        self.assertTrue(len(data.errors) == 1)
182        self.assertTrue(data.detector[0].distance_unit == "mm")
183        self.assertTrue(data.detector[0].name == "fictional hybrid")
184        self.assertTrue(data.detector[0].distance == 4150)
185
186
[eda8972]187    def test_old_cansas_files(self):
188        reader1 = XMLreader(self.cansas1d, self.schema_1_0)
[ac5b69d]189        self.assertTrue(reader1.validate_xml())
[ea67541]190        file_loader = Loader()
191        file1 = file_loader.load(self.cansas1d)
[eda8972]192        reader2 = XMLreader(self.cansas1d_units, self.schema_1_0)
[ac5b69d]193        self.assertTrue(reader2.validate_xml())
[eda8972]194        reader3 = XMLreader(self.cansas1d_badunits, self.schema_1_0)
[ac5b69d]195        self.assertTrue(reader3.validate_xml())
[eda8972]196        reader4 = XMLreader(self.cansas1d_slit, self.schema_1_0)
[ac5b69d]197        self.assertTrue(reader4.validate_xml())
[d72567e]198
199
[c6ca23d]200    def test_save_cansas_v1_0(self):
201        filename = "isis_1_0_write_test.xml"
202        xmlreader = XMLreader(self.isis_1_0, self.schema_1_0)
[ac5b69d]203        valid = xmlreader.validate_xml()
[c6ca23d]204        self.assertTrue(valid)
205        reader_generic = Loader()
206        dataloader = reader_generic.load(self.isis_1_0)
207        reader_cansas = Reader()
208        cansasreader = reader_cansas.read(self.isis_1_0)
209        for i in range(len(dataloader)):
210            self._check_data(dataloader[i])
211            self._check_data(cansasreader[i])
212            reader_generic.save(filename, dataloader[i], None)
213            reader2 = Reader()
214            return_data = reader2.read(filename)
215            written_data = return_data[0]
[2e3b055]216            xmlwrite = XMLreader(filename, self.schema_1_0)
[ac5b69d]217            valid = xmlreader.validate_xml()
[2e3b055]218            self.assertTrue(valid)
[c6ca23d]219            self._check_data(written_data)
[d72567e]220
221
[ea67541]222    def test_processing_instructions(self):
223        reader = XMLreader(self.isis_1_1, self.schema_1_1)
[ac5b69d]224        valid = reader.validate_xml()
[ea67541]225        if valid:
226            ## find the processing instructions and make into a dictionary
[ac5b69d]227            dic = self.get_processing_instructions(reader)
[3241dd2]228            self.assertTrue(dic == {'xml-stylesheet': \
229                                    'type="text/xsl" href="cansas1d.xsl" '})
[d72567e]230
[ea67541]231            xml = "<test><a><b><c></c></b></a></test>"
232            xmldoc = minidom.parseString(xml)
[d72567e]233
[ea67541]234            ## take the processing instructions and put them back in
[ac5b69d]235            xmldoc = self.set_processing_instructions(xmldoc, dic)
[ea67541]236            xml_output = xmldoc.toprettyxml()
[d72567e]237
238
[ac5b69d]239    def set_processing_instructions(self, minidom_object, dic):
240        xmlroot = minidom_object.firstChild
[ea67541]241        for item in dic:
[ac5b69d]242            pi = minidom_object.createProcessingInstruction(item, dic[item])
243            minidom_object.insertBefore(pi, xmlroot)
244        return minidom_object
[d72567e]245
246
[ac5b69d]247    def get_processing_instructions(self, xml_reader_object):
[ea67541]248        dict = {}
[ac5b69d]249        pi = xml_reader_object.xmlroot.getprevious()
[ea67541]250        i = 0
251        while pi is not None:
252            attr = {}
253            pi_name = ""
254            pi_string = etree.tostring(pi)
255            if isinstance(pi_string, str):
256                pi_string = pi_string.replace("<?", "").replace("?>", "")
257                split = pi_string.split(" ", 1)
258                pi_name = split[0]
259                attr = split[1]
260            dict[pi_name] = attr
261            pi = pi.getprevious()
262        return dict
[d72567e]263
264
265class cansas_reader_hdf5(unittest.TestCase):
266
267    def setUp(self):
268        self.loader = Loader()
269        self.datafile_basic = "simpleexamplefile.h5"
270        self.datafile_multiplesasentry = "cansas_1Dand2D_samedatafile.h5"
271        self.datafile_multiplesasdata = "cansas_1Dand2D_samesasentry.h5"
272        self.datafile_multiplesasdata_multiplesasentry = "cansas_1Dand2D_multiplesasentry_multiplesasdata.h5"
273
274    def test_real_data(self):
275        self.data = self.loader.load(self.datafile_basic)
276        self._check_example_data(self.data[0])
277
278    def test_multiple_sasentries(self):
279        self.data = self.loader.load(self.datafile_multiplesasentry)
280        self.assertTrue(len(self.data) == 2)
281        self._check_multiple_data(self.data[0])
282        self._check_multiple_data(self.data[1])
283        self._check_1d_data(self.data[0])
284
285    def _check_multiple_data(self, data):
286        self.assertTrue(data.title == "MH4_5deg_16T_SLOW")
287        self.assertTrue(data.run[0] == '33837')
288        self.assertTrue(len(data.run) == 1)
289        self.assertTrue(data.instrument == "SANS2D")
290        self.assertTrue(data.source.radiation == "Spallation Neutron Source")
291        self.assertTrue(len(data.detector) == 1)
292        self.assertTrue(data.detector[0].name == "rear-detector")
293        self.assertTrue(data.detector[0].distance == 4.385281)
294        self.assertTrue(data.detector[0].distance_unit == 'm')
295        self.assertTrue(len(data.trans_spectrum) == 1)
296
297    def _check_1d_data(self, data):
298        self.assertTrue(isinstance(data, Data1D))
299        self.assertTrue(len(data.x) == 66)
300        self.assertTrue(len(data.x) == len(data.y))
301        self.assertTrue(data.dy[10] == 0.20721350111248701)
302        self.assertTrue(data.y[10] == 24.193889608153476)
303        self.assertTrue(data.x[10] == 0.008981127988654792)
304
305    def _check_2d_data(self, data):
306        self.assertTrue(isinstance(data, Data2D))
307        self.assertTrue(len(data.x) == 66)
308        self.assertTrue(len(data.x) == len(data.y))
309        self.assertTrue(data.dy[10] == 0.20721350111248701)
310        self.assertTrue(data.y[10] == 24.193889608153476)
311        self.assertTrue(data.x[10] == 0.008981127988654792)
312
313    def _check_example_data(self, data):
314        self.assertTrue(data.title == "")
315        self.assertTrue(data.x.size == 100)
316        self.assertTrue(data._xunit == "A^{-1}")
317        self.assertTrue(data._yunit == "cm^{-1}")
318        self.assertTrue(data.y.size == 100)
319        self.assertAlmostEqual(data.y[9], 0.952749011516985)
320        self.assertAlmostEqual(data.x[9], 0.3834415188257777)
321        self.assertAlmostEqual(len(data.meta_data), 0)
322
[2e3b055]323
[4bdd4fdb]324if __name__ == '__main__':
[eda8972]325    unittest.main()   
Note: See TracBrowser for help on using the repository browser.