[8976865] | 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 |
---|