1
2
3 """
4 Authors: Henning O. Sorensen & Erik Knudsen
5 Center for Fundamental Research: Metal Structures in Four Dimensions
6 Risoe National Laboratory
7 Frederiksborgvej 399
8 DK-4000 Roskilde
9 email:erik.knudsen@risoe.dk
10
11 + Jon Wright, ESRF
12
13 Information about the file format from Masakatzu Kobayashi is highly appreciated
14 """
15
16 import numpy, logging
17 logger = logging.getLogger("HiPiCimage")
18 from fabioimage import fabioimage
19
21 """ Read HiPic images e.g. collected with a Hamamatsu CCD camera"""
22
23
25 """
26 Read in a header from an already open file
27
28 """
29 Image_tag = infile.read(2)
30 print Image_tag
31 Comment_len = numpy.fromstring(infile.read(2), numpy.uint16)
32 Dim_1 = numpy.fromstring(infile.read(2), numpy.uint16)[0]
33 Dim_2 = numpy.fromstring(infile.read(2), numpy.uint16)[0]
34 Dim_1_offset = numpy.fromstring(infile.read(2), numpy.uint16)[0]
35 Dim_2_offset = numpy.fromstring(infile.read(2), numpy.uint16)[0]
36 HeaderType = numpy.fromstring(infile.read(2), numpy.uint16)[0]
37 Dump = infile.read(50)
38 Comment = infile.read(Comment_len)
39 self.header['Image_tag'] = Image_tag
40 self.header['Dim_1'] = Dim_1
41 self.header['Dim_2'] = Dim_2
42 self.header['Dim_1_offset'] = Dim_1_offset
43 self.header['Dim_2_offset'] = Dim_2_offset
44
45 if Image_tag != 'IM' :
46
47 logging.warning("no opening. Corrupt header of HiPic file " + \
48 str(infile.name))
49 Comment_split = Comment[:Comment.find('\x00')].split('\r\n')
50
51 for topcomment in Comment_split:
52 topsplit = topcomment.split(',')
53 for line in topsplit:
54 if '=' in line:
55 key, val = line.split('=' , 1)
56
57 key = key.rstrip().lstrip()
58 self.header_keys.append(key)
59 self.header[key] = val.lstrip().rstrip()
60 self.header[key] = val.lstrip('"').rstrip('"')
61
62 - def read(self, fname, frame=None):
63 """
64 Read in header into self.header and
65 the data into self.data
66 """
67 self.header = {}
68 self.resetvals()
69 infile = self._open(fname, "rb")
70 self._readheader(infile)
71
72 try:
73 self.dim1 = int(self.header['Dim_1'])
74 self.dim2 = int(self.header['Dim_2'])
75 except:
76 raise Exception("HiPic file", str(fname) + \
77 "is corrupt, cannot read it")
78 bytecode = numpy.uint16
79 self.bpp = len(numpy.array(0, bytecode).tostring())
80
81
82 block = infile.read(self.dim1 * self.dim2 * self.bpp)
83 infile.close()
84
85
86 try:
87 self.data = numpy.reshape(
88 numpy.fromstring(block, bytecode),
89 [self.dim2, self.dim1])
90 except:
91 print len(block), bytecode, self.bpp, self.dim2, self.dim1
92 raise IOError, \
93 'Size spec in HiPic-header does not match size of image data field'
94 self.bytecode = self.data.dtype.type
95
96
97
98
99
100 if self.data.max() > 4095:
101 gt12bit = self.data > 4095
102 self.data = self.data - gt12bit * (2 ** 16 - 1)
103
104
105 self.pilimage = None
106 return self
107