source: canSAS2012/examples/xml/fakecansas.py @ 221

Last change on this file since 221 was 221, checked in by prjemian, 7 years ago

improving the autogenerator for the examples

File size: 7.7 KB
Line 
1#!/usr/bin/env python
2
3# FIXME:  check the order of array indices!
4
5import inspect
6import string
7import time
8import sys
9import numpy as np
10
11
12from lxml import etree
13
14
15CANSAS_VERSION = '1.0'
16#FILE_TIMESTAMP = "2009-09-09T09:09:09-0000"
17hh = -time.timezone/60/60
18mm = abs(time.timezone/60) - 60*abs(hh)
19FILE_TIMESTAMP = time.strftime("%Y-%m-%dT%H:%M:%S") + '%+03d%02d' % (hh, mm)
20FILE_PRODUCER = "canSAS"
21
22
23class ExampleFile():
24        '''Support for XML files'''
25        rootTag = "SASroot"
26        root = None
27        filename = None
28        entry = None
29        sasdata = None
30       
31        def __init__(self, filename):
32                self.filename = filename
33
34        def createFile(self):
35                '''creates the in-memory data structure - actual file creation happens in closeFile()'''
36                self.root = etree.Element(self.rootTag)
37                self.root.attrib['producer'] = FILE_PRODUCER
38                self.root.attrib['file_time'] = FILE_TIMESTAMP
39                self.root.attrib['file_name'] = self.filename
40                #self.root.attrib['Python_etree_version'] = etree.__version__
41
42        def closeFile(self):
43                '''write (or overwrite) the named XML file'''
44                if self.root is not None and self.filename is not None:
45                        text = etree.tostring(self.root, pretty_print=True, encoding='utf-8')
46                        f = open(self.filename, 'w')
47                        f.write('<?xml version="1.0" encoding="UTF-8"?>\n')
48                        #if xslt != None:
49                        #       f.write('<?xml-stylesheet type="text/xsl" href="%s"?>\n' % xslt)
50                        f.write( text )
51                        f.close()
52
53        def createEntry(self, name):
54                if self.root is None:
55                        raise "No parent SASroot node created yet!"
56                self.entry = etree.SubElement(self.root, 'SASentry')
57                self.entry.attrib['name'] = name                # TODO: automatically choose this name
58                self.entry.attrib['version'] = CANSAS_VERSION
59                self.sasdata = None
60
61        def createTitle(self, title):
62                if self.root is None:
63                        raise "No parent SASentry node created yet!"
64                node = etree.SubElement(self.entry, 'Title')
65                node.text = title
66       
67        def createData(self, name, qi, ii, mi=None):
68                if self.entry is None:
69                        raise "No parent SASentry node created yet!"
70                self.sasdata = etree.SubElement(self.entry, 'SASdata')
71                self.sasdata.attrib['name'] = name              # TODO: automatically choose this name
72                self.sasdata.attrib['I_axes'] = ii
73                items = self._list_to_text_list(qi)
74                self.sasdata.attrib['Q_indices'] = items
75                if mi != None:
76                        items = self._list_to_text_list(mi)
77                        self.sasdata.attrib['Mask_indices'] = items
78
79        def createDataSet(self, name, array, attributes=None):
80                if self.sasdata is None:
81                        raise "No parent SASdata node created yet!"
82                node = etree.SubElement(self.entry, name)
83                text = self._list_to_text_list(array.shape, delimiter='')
84                node.attrib['size'] = text.strip('(),')
85                arrText = self._list_to_text_list(array, delimiter=' ')
86                # now, split each multi-D array to lines
87                arrText = string.replace(arrText, ']', '\n')
88                arrText = string.replace(arrText, '[', ' ')
89                if len(array.shape)>1:
90                        # if multi-D, indent each line the same amount
91                        arrText = '\n' + '\n'.join([' '*8 + line.strip() for line in arrText.splitlines()])
92                        arrText += '\n' + ' '*4
93                node.text = arrText
94                if attributes != None:
95                        for key, value in attributes.items():
96                                node.attrib[key] = value
97               
98        def _list_to_text_list(self, data, delimiter = ','):
99                return delimiter.join( str(data).strip('[]').split() )
100
101
102class SimpleExampleFile(ExampleFile):
103        def write(self):
104                self.createFile()
105                self.createEntry("sasentry01")
106                self.createTitle('example of simple 1D SAS data, I(Q)')
107                self.createData("sasdata01", np.array([0]), "Q")
108                n = 5
109                self.createDataSet("Q", np.random.rand(n,), {"units": "1/A"})
110                self.createDataSet("I", np.random.rand(n,), {"units": "1/cm"})
111                self.closeFile()
112
113class Simple1DTimeSeries(ExampleFile):
114        def write(self):
115                self.createFile()
116                self.createEntry("sasentry01")
117                self.createTitle('example of simple 1D SAS data in a time series, I(Q, t)')
118                self.createData("sasdata01", np.array([1]), "Time,Q")
119                n = 5
120                nt = 7
121                self.createDataSet("Q", np.random.rand(n,), {"units": "1/A"})
122                self.createDataSet("I", np.random.rand(nt,n,), {"units": "1/cm"})
123                self.createDataSet("Time", np.random.rand(nt,), {"units": "s"})
124                self.closeFile()
125
126class Generic1DTimeSeries(ExampleFile):
127        def write(self):
128                self.createFile()
129                self.createEntry("sasentry01")
130                self.createTitle('example of generic 1D SAS data in a time series, I(Q(t), t)')
131                self.createData("sasdata01", np.array([0,1]), "Time,Q")
132                n = 5
133                nt = 7
134                self.createDataSet("Q", np.random.rand(nt,n,), {"units": "1/A"})
135                self.createDataSet("I", np.random.rand(nt,n,), {"units": "1/cm"})
136                self.createDataSet("Time", np.random.rand(nt,), {"units": "s"})
137                self.closeFile()
138
139class Simple2DCase(ExampleFile):
140        def write(self):
141                self.createFile()
142                self.createEntry("sasentry01")
143                self.createTitle('example of simple 2D (image) SAS data, I(Q)')
144                self.createData("sasdata01", np.array([0,1]), "Q,Q")
145                nx = 7
146                ny = 5
147                # TODO: Q or Qx, Qy, Qz?
148                self.createDataSet("Q", np.random.rand(nx,ny,), {"units": "1/A"})
149                self.createDataSet("I", np.random.rand(nx,ny,), {"units": "1/cm"})
150                self.closeFile()
151
152
153class Simple2DMaskedCase(ExampleFile):
154        def write(self):
155                self.createFile()
156                self.createEntry("sasentry01")
157                self.createTitle('example of a simple masked 2D (image) SAS data, I(Q)')
158                self.createData("sasdata01", np.array([0,1]), "Q,Q", np.array([0,1]))
159                nx = 7
160                ny = 5
161                # TODO: Q or Qx, Qy, Qz?
162                self.createDataSet("Q", np.random.rand(nx,ny,), {"units": "1/A"})
163                self.createDataSet("I", np.random.rand(nx,ny,), {"units": "1/cm"})
164                self.createDataSet("Mask", np.array(np.random.randint(0,1,nx*ny,).reshape(nx,ny), dtype=np.dtype("int8")))
165                self.closeFile()
166
167
168class Generic2DCase(ExampleFile):
169        def write(self):
170                self.createFile()
171                self.createEntry("sasentry01")
172                self.createTitle('example of generic 2D SAS data, I(Q)')
173                self.createData("sasdata01", np.array([0]), "Q")
174                nx = 7
175                ny = 5
176                # TODO: Q or Qx, Qy, Qz?
177                self.createDataSet("Q", np.random.rand(nx*ny,), {"units": "1/A"})
178                self.createDataSet("I", np.random.rand(nx*ny,), {"units": "1/cm"})
179                self.closeFile()
180
181
182class Generic2DTimeSeries(ExampleFile):
183        def write(self):
184                self.createFile()
185                self.createEntry("sasentry01")
186                self.createTitle('example of generic 2D SAS data in a time series, I(Q(t),t)')
187                self.createData("sasdata01", np.array([0,1]), "Time,Q")
188                nx = 7
189                ny = 5
190                nt = 4
191                # TODO: Q or Qx, Qy, Qz?
192                self.createDataSet("Q", np.random.rand(nt,nx*ny,), {"units": "1/A"})
193                self.createDataSet("I", np.random.rand(nt,nx*ny,), {"units": "1/cm"})
194                self.createDataSet("Time", np.random.rand(nt,), {"units": "ms"})
195                self.closeFile()
196
197
198class Generic2DTimeTPSeries(ExampleFile):
199        def write(self):
200                self.createFile()
201                self.createEntry("sasentry01")
202                self.createTitle('example of generic 2D SAS data (images) in a time, T, & P series, I(T,t,P,Q(t))')
203                self.createData("sasdata01", np.array([1,3,4]), "Temperature,Time,Pressure,Q,Q")
204                nqx = 5
205                nqy = 6
206                ntime = 4
207                ntemperature = 3
208                npressure = 2
209                self.createDataSet("Qx", np.random.rand(ntime,nqx,nqy), {"units": "1/A"})
210                self.createDataSet("Qy", np.random.rand(ntime,nqx,nqy), {"units": "1/A"})
211                self.createDataSet("Qz", np.random.rand(ntime,nqx,nqy), {"units": "1/A"})
212                self.createDataSet("I", np.random.rand(ntemperature,ntime,npressure,nqx,nqy), {"units": "1/cm"})
213                self.createDataSet("Temperature", np.random.rand(ntemperature,), {"units": "ms"})
214                self.createDataSet("Time", np.random.rand(ntime,), {"units": "ms"})
215                self.createDataSet("Pressure", np.random.rand(npressure,), {"units": "ms"})
216                self.closeFile()
217
218
219def main():
220        subclasses = []
221        classType=ExampleFile
222        callers_module = sys._getframe(0).f_globals['__name__']
223        classes = inspect.getmembers(sys.modules[callers_module], inspect.isclass)
224        for name, obj in classes:
225                if (obj is not classType) and (classType in inspect.getmro(obj)):
226                        subclasses.append((obj, name))
227        for f in subclasses:
228                filename = f[1]+".xml"
229                filename = filename.lower()
230                f[0](filename).write()
231
232
233if __name__ == "__main__":
234        main()
Note: See TracBrowser for help on using the repository browser.