source: trunk/imports/G2img_1TIF.py @ 2716

Last change on this file since 2716 was 2716, checked in by vondreele, 5 years ago

import polarization for tif files from metadata file

  • Property svn:eol-style set to native
  • Property svn:keywords set to Date Author Revision URL Id
File size: 12.8 KB
Line 
1# -*- coding: utf-8 -*-
2########### SVN repository information ###################
3# $Date: 2017-02-20 21:45:19 +0000 (Mon, 20 Feb 2017) $
4# $Author: vondreele $
5# $Revision: 2716 $
6# $URL: trunk/imports/G2img_1TIF.py $
7# $Id: G2img_1TIF.py 2716 2017-02-20 21:45:19Z vondreele $
8########### SVN repository information ###################
9'''
10*Module G2img_1TIF: Tagged-image File images*
11--------------------------------------------------
12
13Routine to read an image in Tagged-image file (TIF) format as well as a variety
14of slightly incorrect pseudo-TIF formats used at instruments around the world.
15Note that the name ``G2img_1TIF`` is used so that this file will
16sort to the top of the image formats and thus show up first in the menu.
17(It is the most common, alas).
18
19'''
20
21import struct as st
22import GSASIIIO as G2IO
23import GSASIIpath
24import numpy as np
25DEBUG = False
26GSASIIpath.SetVersionNumber("$Revision: 2716 $")
27class TIF_ReaderClass(G2IO.ImportImage):
28    '''Reads TIF files using a routine (:func:`GetTifData`) that looks
29    for files that can be identified from known instruments and will
30    correct for slightly incorrect TIF usage. If that routine fails,
31    it will be read with a standard TIF reader, which can handle compression
32    and other things less commonly used at beamlines.
33    '''
34    def __init__(self):
35        super(self.__class__,self).__init__( # fancy way to self-reference
36            extensionlist=('.tif','.tiff'),
37            strictExtension=False,
38            formatName = 'TIF image',
39            longFormatName = 'Various .tif and pseudo-TIF formats'
40            )
41
42    def ContentsValidator(self, filepointer):
43        '''Does the header match the required TIF header?
44        '''
45        tag = filepointer.read(2)
46        if tag == 'II' and int(st.unpack('<h',filepointer.read(2))[0]) == 42: #little endian
47            pass
48        elif tag == 'MM' and int(st.unpack('>h',filepointer.read(2))[0]) == 42: #big endian
49            pass
50        else:
51            return False # header not found; not valid TIF
52        return True
53   
54    def Reader(self,filename,filepointer, ParentFrame=None, **unused):
55        '''Read the TIF file using :func:`GetTifData`. If that fails,
56        use :func:`scipy.misc.imread` and give the user a chance to
57        edit the likely wrong default image parameters.
58        '''
59       
60        self.Comments,self.Data,self.Npix,self.Image = GetTifData(filename)
61        if self.Npix == 0:
62            print("GetTifData failed to read "+str(filename)+" Trying SciPy")
63            import scipy.misc
64            self.Image = scipy.misc.imread(filename,flatten=True)
65            self.Npix = self.Image.size
66            if ParentFrame:
67                self.Comments = ['no metadata']
68                self.Data = {'wavelength': 0.1, 'pixelSize': [200, 200], 'distance': 100.0}
69                self.Data['size'] = list(self.Image.shape)
70                self.Data['center'] = [int(i/2) for i in self.Image.shape]
71                G2IO.EditImageParms(ParentFrame,self.Data,self.Comments,self.Image,filename)
72        if self.Npix == 0:
73            return False
74        self.LoadImage(ParentFrame,filename)
75        return True
76
77def GetTifData(filename):
78    '''Read an image in a pseudo-tif format,
79    as produced by a wide variety of software, almost always
80    incorrectly in some way.
81    '''
82    import struct as st
83    import array as ar
84    import ReadMarCCDFrame as rmf
85    image = None
86    File = open(filename,'rb')
87    dataType = 5
88    center = [None,None]
89    wavelength = None
90    distance = None
91    polarization = None
92    try:
93        Meta = open(filename+'.metadata','Ur')
94        head = Meta.readlines()
95        for line in head:
96            line = line.strip()
97            try:
98                if '=' not in line: continue
99                keyword = line.split('=')[0].strip()
100                if 'dataType' == keyword:
101                    dataType = int(line.split('=')[1])
102                elif 'wavelength' == keyword.lower():
103                    wavelength = float(line.split('=')[1])
104                elif 'distance' == keyword.lower():
105                    distance = float(line.split('=')[1])
106                elif 'polarization' == keyword.lower():
107                    polarization = float(line.split('=')[1])
108            except:
109                print('error reading metadata: '+line)
110        Meta.close()
111    except IOError:
112        print 'no metadata file found - will try to read file anyway'
113        head = ['no metadata file found',]
114       
115    tag = File.read(2)
116    byteOrd = '<'
117    if tag == 'II' and int(st.unpack('<h',File.read(2))[0]) == 42:     #little endian
118        IFD = int(st.unpack(byteOrd+'i',File.read(4))[0])
119    elif tag == 'MM' and int(st.unpack('>h',File.read(2))[0]) == 42:   #big endian
120        byteOrd = '>'
121        IFD = int(st.unpack(byteOrd+'i',File.read(4))[0])       
122    else:
123        lines = ['not a detector tiff file',]
124        return lines,0,0,0
125    File.seek(IFD)                                                  #get number of directory entries
126    NED = int(st.unpack(byteOrd+'h',File.read(2))[0])
127    IFD = {}
128    nSlice = 1
129    for ied in range(NED):
130        Tag,Type = st.unpack(byteOrd+'Hh',File.read(4))
131        nVal = st.unpack(byteOrd+'i',File.read(4))[0]
132        if DEBUG: print 'Try:',Tag,Type,nVal
133        if Type == 1:
134            Value = st.unpack(byteOrd+nVal*'b',File.read(nVal))
135        elif Type == 2:
136            Value = st.unpack(byteOrd+'i',File.read(4))
137        elif Type == 3:
138            Value = st.unpack(byteOrd+nVal*'h',File.read(nVal*2))
139            st.unpack(byteOrd+nVal*'h',File.read(nVal*2))
140        elif Type == 4:
141            if Tag in [273,279]:
142                nSlice = nVal
143                nVal = 1
144            Value = st.unpack(byteOrd+nVal*'i',File.read(nVal*4))
145        elif Type == 5:
146            Value = st.unpack(byteOrd+nVal*'i',File.read(nVal*4))
147        elif Type == 11:
148            Value = st.unpack(byteOrd+nVal*'f',File.read(nVal*4))
149        IFD[Tag] = [Type,nVal,Value]
150        if DEBUG: print Tag,IFD[Tag]
151    sizexy = [IFD[256][2][0],IFD[257][2][0]]
152    [nx,ny] = sizexy
153    Npix = nx*ny
154    if 34710 in IFD:
155        print 'Read MAR CCD tiff file: ',filename
156        marFrame = rmf.marFrame(File,byteOrd,IFD)
157        image = np.flipud(np.array(np.asarray(marFrame.image),dtype=np.int32))
158        tifType = marFrame.filetitle
159        pixy = [marFrame.pixelsizeX/1000.0,marFrame.pixelsizeY/1000.0]
160        head = marFrame.outputHead()
161# extract resonable wavelength from header
162        wavelength = marFrame.sourceWavelength*1e-5
163        wavelength = (marFrame.opticsWavelength > 0) and marFrame.opticsWavelength*1e-5 or wavelength
164        wavelength = (wavelength <= 0) and None or wavelength
165# extract resonable distance from header
166        distance = (marFrame.startXtalToDetector+marFrame.endXtalToDetector)*5e-4
167        distance = (distance <= marFrame.startXtalToDetector*5e-4) and marFrame.xtalToDetector*1e-3 or distance
168        distance = (distance <= 0) and None or distance
169# extract resonable center from header
170        center = [marFrame.beamX*marFrame.pixelsizeX*1e-9,marFrame.beamY*marFrame.pixelsizeY*1e-9]
171        center = (center[0] != 0 and center[1] != 0) and center or [None,None]
172#print head,tifType,pixy
173    elif nSlice > 1:    #CheMin multislice tif file!
174        try:
175            import Image as Im
176        except ImportError:
177            try:
178                from PIL import Image as Im
179            except ImportError:
180                print "PIL/pillow Image module not present. This TIF cannot be read without this"
181                #raise Exception("PIL/pillow Image module not found")
182                lines = ['not a detector tiff file',]
183                return lines,0,0,0
184        tifType = 'CheMin'
185        pixy = [40,40]
186        image = np.flipud(np.array(Im.open(filename)))*10.
187        distance = 18.0
188        center = [pixy[0]*sizexy[0]/2000,0]     #the CheMin beam stop is here
189        wavelength = 1.78892
190    elif 272 in IFD:
191        ifd = IFD[272]
192        File.seek(ifd[2][0])
193        S = File.read(ifd[1])
194        if 'PILATUS' in S:
195            tifType = 'Pilatus'
196            dataType = 0
197            pixy = [172,172]
198            File.seek(4096)
199            print 'Read Pilatus tiff file: ',filename
200            image = ar.array('I',File.read(4*Npix))
201            image = np.array(np.asarray(image),dtype=np.int32)
202        else:
203            if IFD[258][2][0] == 16:
204                tifType = 'GE'
205                pixy = [200,200]
206                File.seek(8)
207                print 'Read GE-detector tiff file: ',filename
208                image = np.array(ar.array('H',File.read(2*Npix)),dtype=np.int32)
209            elif IFD[258][2][0] == 32:
210                tifType = 'CHESS'
211                pixy = [200,200]
212                File.seek(8)
213                print 'Read CHESS-detector tiff file: ',filename
214                image = np.array(ar.array('I',File.read(4*Npix)),dtype=np.int32)
215    elif 270 in IFD:
216        File.seek(IFD[270][2][0])
217        S = File.read(IFD[273][2][0]-IFD[270][2][0])
218        if 'ImageJ' in S:
219            tifType = 'ImageJ'
220            dataType = 0
221            pixy = [200,200]*IFD[277][2][0]
222            File.seek(IFD[273][2][0])
223            print 'Read ImageJ tiff file: ',filename
224            image = ar.array('H',File.read(2*Npix))
225            if '>' in byteOrd:
226                image.byteswap()
227            image = np.array(np.asarray(image,dtype='H'),dtype=np.int32)           
228    elif 262 in IFD and IFD[262][2][0] > 4:
229        tifType = 'DND'
230        pixy = [158,158]
231        File.seek(512)
232        print 'Read DND SAX/WAX-detector tiff file: ',filename
233        image = np.array(ar.array('H',File.read(2*Npix)),dtype=np.int32)
234    elif sizexy == [1536,1536]:
235        tifType = 'APS Gold'
236        pixy = [150,150]
237        File.seek(64)
238        print 'Read Gold tiff file:',filename
239        image = np.array(ar.array('H',File.read(2*Npix)),dtype=np.int32)
240    elif sizexy == [2048,2048] or sizexy == [1024,1024] or sizexy == [3072,3072]:
241        if IFD[273][2][0] == 8:
242            if IFD[258][2][0] == 32:
243                tifType = 'PE'
244                pixy = [200,200]
245                File.seek(8)
246                print 'Read APS PE-detector tiff file: ',filename
247                if dataType == 5:
248                    image = np.array(ar.array('f',File.read(4*Npix)),dtype=np.int32)
249                else:
250                    image = np.array(ar.array('I',File.read(4*Npix)),dtype=np.int32)
251            elif IFD[258][2][0] == 16: 
252                tifType = 'MedOptics D1'
253                pixy = [46.9,46.9]
254                File.seek(8)
255                print 'Read MedOptics D1 tiff file: ',filename
256                image = np.array(ar.array('H',File.read(2*Npix)),dtype=np.int32)
257                 
258        elif IFD[273][2][0] == 4096:
259            if sizexy[0] == 3072:
260                pixy =  [73,73]
261                tifType = 'MAR225'           
262            else:
263                pixy = [158,158]
264                tifType = 'MAR325'           
265            File.seek(4096)
266            print 'Read MAR CCD tiff file: ',filename
267            image = np.array(ar.array('H',File.read(2*Npix)),dtype=np.int32)
268        elif IFD[273][2][0] == 512:
269            tifType = '11-ID-C'
270            pixy = [200,200]
271            File.seek(512)
272            print 'Read 11-ID-C tiff file: ',filename
273            image = np.array(ar.array('H',File.read(2*Npix)),dtype=np.int32)
274                   
275    elif sizexy == [4096,4096]:
276        if IFD[273][2][0] == 8:
277            if IFD[258][2][0] == 16:
278                tifType = 'scanCCD'
279                pixy = [9,9]
280                File.seek(8)
281                print 'Read APS scanCCD tiff file: ',filename
282                image = np.array(ar.array('H',File.read(2*Npix)),dtype=np.int32)
283        elif IFD[273][2][0] == 4096:
284            tifType = 'Rayonix'
285            pixy = [73.242,73.242]
286            File.seek(4096)
287            print 'Read Rayonix MX300HE tiff file: ',filename
288            image = np.array(ar.array('H',File.read(2*Npix)),dtype=np.int32)
289#    elif sizexy == [960,960]:
290#        tiftype = 'PE-BE'
291#        pixy = (200,200)
292#        File.seek(8)
293#        if not imageOnly:
294#            print 'Read Gold tiff file:',filename
295#        image = np.array(ar.array('H',File.read(2*Npix)),dtype=np.int32)
296           
297    if image is None:
298        lines = ['not a known detector tiff file',]
299        return lines,0,0,0
300       
301    if sizexy[1]*sizexy[0] != image.size: # test is resize is allowed
302        lines = ['not a known detector tiff file',]
303        return lines,0,0,0
304       
305    image = np.reshape(image,(sizexy[1],sizexy[0]))
306    center = (not center[0]) and [pixy[0]*sizexy[0]/2000,pixy[1]*sizexy[1]/2000] or center
307    wavelength = (not wavelength) and 0.10 or wavelength
308    distance = (not distance) and 100.0 or distance
309    polarization = (not polarization) and 0.99 or polarization
310    data = {'pixelSize':pixy,'wavelength':wavelength,'distance':distance,'center':center,'size':sizexy,
311            'setdist':distance,'PolaVal':[polarization,False]}
312    File.close()   
313    return head,data,Npix,image
Note: See TracBrowser for help on using the repository browser.