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

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

keywords

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