1 """
2 Authors: Henning O. Sorensen & Erik Knudsen
3 Center for Fundamental Research: Metal Structures in Four Dimensions
4 Risoe National Laboratory
5 Frederiksborgvej 399
6 DK-4000 Roskilde
7 email:erik.knudsen@risoe.dk
8
9 + Jon Wright, ESRF
10 """
11
12 import numpy as n, logging
13
14 from fabioimage import fabioimage
15
16 DATA_TYPES = { 2 : n.int16,
17 4 : n.uint16,
18 3 : n.int32,
19 5 : n.uint32,
20 6 : n.float32,
21 7 : n.float,
22 8 : n.int8,
23 9 : None,
24 10 : None,
25 15 : 'Struct',
26 18 : None,
27 20 : None
28 }
29
30 DATA_BYTES = { 2 : 2,
31 4 : 2,
32 3 : 4,
33 5 : 4,
34 6 : 4,
35 7 : 8,
36 8 : 1,
37 9 : None,
38 10 : None,
39 15 : 'Struct',
40 18 : None,
41 20 : None
42 }
43
44
45
47 """ Read and try to write the dm3 data format """
48
49
51 self.infile.seek(0)
52 file_format = self.readbytes(4, n.uint32)[0]
53 assert file_format == 3, 'Wrong file type '
54 self.bytes_in_file = self.readbytes(4, n.uint32)[0]
55 self.byte_order = self.readbytes(4, n.uint32)[0]
56 print 'read dm3 file - file format ', file_format
57 print 'Bytes in file : ' , self.bytes_in_file
58 print 'Byte order :', self.byte_order, ' - 0 = bigEndian , 1 = littleEndian'
59
60 if self.byte_order == 0:
61 self.swap = True
62 elif self.byte_order == 1:
63 self.swap = False
64 else:
65 raise ValueError
66
67 - def read(self, fname):
68 self.header = {}
69 self.resetvals()
70 self.infile = self._open(fname, "rb")
71 self._readheader()
72 self.go_on = True
73 print self.go_on
74 while self.go_on:
75 self.read_tag_group()
76 self.read_tag_entry()
77 if self.infile.tell() > self.bytes_in_file: break
78
79 while self.tag_is_data == 21:
80 self.read_tag_entry()
81 if self.infile.tell() > self.bytes_in_file:
82 self.go_on = False
83
84 (dim1_raw, dim2_raw) = self.header['Active Size (pixels)'].split()
85 (dim1_raw, dim2_raw) = (eval(dim1_raw), eval(dim2_raw))
86 (dim1_binning, dim2_binning) = self.header['Binning'].split()
87 (dim1_binning, dim2_binning) = (eval(dim1_binning), eval(dim2_binning))
88 self.dim1 = dim1_raw / dim1_binning
89 self.dim2 = dim2_raw / dim2_binning
90
91 if self.header.has_key('Data'):
92 self.data = self.header['Data'].reshape(self.dim1, self.dim2)
93
94 - def readbytes(self, bytes_to_read, format, swap=True):
95 raw = self.infile.read(bytes_to_read)
96 if format != None:
97 data = n.fromstring(raw, format)
98 else:
99 data = raw
100 if swap:
101 data = data.byteswap()
102 return data
103
104
105
107
108 self.grouptag_is_sorted = self.readbytes(1, n.uint8)[0]
109 self.grouptag_is_open = self.readbytes(1, n.uint8)[0]
110 self.grouptag_no_tags = self.readbytes(4, n.uint32)[0]
111
112
113
114
115 - def read_tag_entry(self):
116
117 self.tag_is_data = self.readbytes(1, n.uint8)[0]
118 self.tag_label_length = self.readbytes(2, n.uint16)[0]
119
120
121 if self.tag_label_length != 0:
122 tag_label = self.infile.read(self.tag_label_length)
123 else:
124 tag_label = None
125
126 if self.tag_is_data == 21:
127
128 self.header[tag_label] = self.read_tag_type()
129
130
131
133 if self.infile.read(4) != '%%%%':
134 raise IOError
135 self.tag_data_type = self.readbytes(4, n.uint32)[0]
136
137 self.tag_encoded_type = self.readbytes(4, n.uint32)[0]
138
139 if self.tag_data_type == 1:
140
141 return self.readbytes(DATA_BYTES[ self.tag_encoded_type],
142 DATA_TYPES[ self.tag_encoded_type],
143 swap=self.swap)[0]
144
145 if self.tag_encoded_type == 20 and self.tag_data_type == 3 :
146 self.data_type = self.readbytes(4, n.uint32)[0]
147 self.no_data_elements = self.readbytes(4, n.uint32)[0]
148 if self.data_type == 10:
149
150 dump = self.infile.read(self.no_data_elements)
151 return None
152
153
154
155 read_no_bytes = DATA_BYTES[self.data_type] * self.no_data_elements
156 format = DATA_TYPES[self.data_type]
157 return self.readbytes(read_no_bytes, format, swap=self.swap)
158
159
160
161
162
163 if self.tag_encoded_type == 20 and self.tag_data_type > 3 :
164 self.tag_encoded_type = self.readbytes(4, n.uint32)[0]
165
166 if self.tag_encoded_type == 15:
167
168 struct_name_length = self.readbytes(4, n.int32)[0]
169 struct_number_fields = self.readbytes(4, n.int32)[0]
170
171
172 field_info = []
173 for i in range(struct_number_fields):
174 field_info.append([self.readbytes(4, n.int32)[0], self.readbytes(4, n.int32)[0]])
175
176 self.no_data_elements = self.readbytes(4, n.int32)[0]
177
178 bytes_in_struct = 0
179 for i in range(struct_number_fields):
180 bytes_in_struct += DATA_BYTES[field_info[i][1]]
181
182 dump = self.infile.read(self.no_data_elements * bytes_in_struct)
183 return None
184
185
186 if self.tag_encoded_type == 15:
187
188 struct_name_length = self.readbytes(4, n.int32)[0]
189 struct_number_fields = self.readbytes(4, n.int32)[0]
190
191
192 field_info = []
193 for i in range(struct_number_fields):
194 field_info.append([self.readbytes(4, n.int32)[0], self.readbytes(4, n.int32)[0]])
195
196 field_data = ''
197 for i in range(struct_number_fields):
198
199 field_data = field_data + self.readbytes(field_info[i][0], None, swap=False) + ' '
200 field_data = field_data + '%i ' % self.readbytes(DATA_BYTES[field_info[i][1]],
201 DATA_TYPES[field_info[i][1]],
202 swap=self.swap)[0]
203 return field_data
204
206 self.encoded_datatype = n.fromstring(self.infile.read(4), n.uint32).byteswap()
207