1 | from sas.sascalc.dataloader.readers.cansas_reader import Reader as CansasReader |
---|
2 | from sas.sascalc.dataloader.data_info import Data1D |
---|
3 | |
---|
4 | import inspect |
---|
5 | |
---|
6 | class CansasWriter(CansasReader): |
---|
7 | |
---|
8 | def write(self, filename, datainfo, sasentry_attrs=None): |
---|
9 | """ |
---|
10 | Write the content of a Data1D as a CanSAS XML file |
---|
11 | |
---|
12 | :param filename: name of the file to write |
---|
13 | :param datainfo: Data1D object |
---|
14 | """ |
---|
15 | # Create XML document |
---|
16 | doc, _ = self._to_xml_doc(datainfo, sasentry_attrs) |
---|
17 | # Write the file |
---|
18 | file_ref = open(filename, 'w') |
---|
19 | if self.encoding == None: |
---|
20 | self.encoding = "UTF-8" |
---|
21 | doc.write(file_ref, encoding=self.encoding, |
---|
22 | pretty_print=True, xml_declaration=True) |
---|
23 | file_ref.close() |
---|
24 | |
---|
25 | |
---|
26 | def _to_xml_doc(self, datainfo, sasentry_attrs=None): |
---|
27 | """ |
---|
28 | Create an XML document to contain the content of a Data1D |
---|
29 | |
---|
30 | :param datainfo: Data1D object |
---|
31 | """ |
---|
32 | if not issubclass(datainfo.__class__, Data1D): |
---|
33 | raise RuntimeError, "The cansas writer expects a Data1D instance" |
---|
34 | |
---|
35 | # Get PIs and create root element |
---|
36 | pi_string = self._get_pi_string() |
---|
37 | # Define namespaces and create SASroot object |
---|
38 | main_node = self._create_main_node() |
---|
39 | # Create ElementTree, append SASroot and apply processing instructions |
---|
40 | base_string = pi_string + self.to_string(main_node) |
---|
41 | base_element = self.create_element_from_string(base_string) |
---|
42 | doc = self.create_tree(base_element) |
---|
43 | # Create SASentry Element |
---|
44 | entry_node = self.create_element("SASentry", sasentry_attrs) |
---|
45 | root = doc.getroot() |
---|
46 | root.append(entry_node) |
---|
47 | |
---|
48 | # Add Title to SASentry |
---|
49 | self.write_node(entry_node, "Title", datainfo.title) |
---|
50 | # Add Run to SASentry |
---|
51 | self._write_run_names(datainfo, entry_node) |
---|
52 | # Add Data info to SASEntry |
---|
53 | self._write_data(datainfo, entry_node) |
---|
54 | # Transmission Spectrum Info |
---|
55 | self._write_trans_spectrum(datainfo, entry_node) |
---|
56 | # Sample info |
---|
57 | self._write_sample_info(datainfo, entry_node) |
---|
58 | # Instrument info |
---|
59 | instr = self._write_instrument(datainfo, entry_node) |
---|
60 | # Source |
---|
61 | self._write_source(datainfo, instr) |
---|
62 | # Collimation |
---|
63 | self._write_collimation(datainfo, instr) |
---|
64 | # Detectors |
---|
65 | self._write_detectors(datainfo, instr) |
---|
66 | # Processes info |
---|
67 | self._write_process_notes(datainfo, entry_node) |
---|
68 | # Note info |
---|
69 | self._write_notes(datainfo, entry_node) |
---|
70 | # Return the document, and the SASentry node associated with |
---|
71 | # the data we just wrote |
---|
72 | |
---|
73 | return doc, entry_node |
---|