source: trunk/GSASIIIO.py @ 243

Last change on this file since 243 was 243, checked in by vondreele, 11 years ago

GSASIIpeak.py - added factorize for future use in finding good numbers for fft
GSASIIimgGUI.py - minor tweak to q-value formatting & make small angle name 'SASD'
GSASIIIO.py - major refactor of GetTifData?

  • Property svn:keywords set to Date Author Revision URL Id
File size: 45.8 KB
Line 
1"""GSASIIIO: functions for IO of data
2   Copyright: 2008, Robert B. Von Dreele (Argonne National Laboratory)
3"""
4########### SVN repository information ###################
5# $Date: 2011-02-08 21:47:07 +0000 (Tue, 08 Feb 2011) $
6# $Author: vondreele $
7# $Revision: 243 $
8# $URL: trunk/GSASIIIO.py $
9# $Id: GSASIIIO.py 243 2011-02-08 21:47:07Z vondreele $
10########### SVN repository information ###################
11import wx
12import math
13import numpy as np
14import cPickle
15import sys
16import random as ran
17import GSASIIpath
18import GSASIIgrid as G2gd
19import GSASIIspc as G2spc
20import GSASIIlattice as G2lat
21import GSASIIElem as G2el
22import os.path as ospath
23
24def sfloat(S):
25    if S.strip():
26        return float(S)
27    else:
28        return 0.0
29
30def sint(S):
31    if S.strip():
32        return int(S)
33    else:
34        return 0
35
36def SelectPowderData(self, filename):
37    """Selects banks of data from a filename of any GSAS powder data format
38    Input - filename: any GSAS powder data formatted file (currently STD, FXYE, FXY & ESD)
39    Returns - a list of banks to be read; each entry in list is a tuple containing:
40    filename: same as input filename
41    Pos: position for start of data; record just after BANK record
42    Bank: the BANK record
43    """
44    File = open(filename,'Ur')
45    Title = '''
46First line of this file:
47'''+File.readline()
48    dlg = wx.MessageDialog(self, Title, 'Is this the file you want?', 
49    wx.YES_NO | wx.ICON_QUESTION)
50    try:
51        result = dlg.ShowModal()
52    finally:
53        dlg.Destroy()
54    if result == wx.ID_NO: return (0,0)
55    Temperature = 300
56       
57    self.IparmName = GetInstrumentFile(self,filename)
58    if self.IparmName:
59        Iparm = GetInstrumentData(self.IparmName)
60    else:
61        Iparm = {}                                               #Assume CuKa lab data if no iparm file
62        Iparm['INS   HTYPE '] = 'PXC '
63        Iparm['INS  1 ICONS'] = '  1.540500  1.544300       0.0         0       0.7    0       0.5   '
64        Iparm['INS  1PRCF1 '] = '    3    8      0.01                                                '
65        Iparm['INS  1PRCF11'] = '   2.000000E+00  -2.000000E+00   5.000000E+00   0.000000E+00        '
66        Iparm['INS  1PRCF12'] = '   0.000000E+00   0.000000E+00   0.150000E-01   0.150000E-01        '
67    S = 1
68    Banks = []
69    Pos = []
70    FoundData = []
71    Comments = []
72    wx.BeginBusyCursor()
73    try:
74        while S:
75            S = File.readline()
76            if S[:1] != '#':
77                if S[:4] == 'BANK':
78                    Banks.append(S)
79                    Pos.append(File.tell())
80            else:
81                Comments.append(S[:-1])
82                if 'Temp' in S:
83                    Temperature = float(S[:-1].split()[-1])
84        File.close()
85    finally:
86        wx.EndBusyCursor()
87    if Comments:
88       print 'Comments on file:'
89       for Comment in Comments: print Comment
90    if Banks:
91        result = [0]
92        if len(Banks) >= 2:
93            dlg = wx.MultiChoiceDialog(self, 'Which scans do you want?', 'Select scans', Banks, wx.CHOICEDLG_STYLE)
94            try:
95                if dlg.ShowModal() == wx.ID_OK:
96                    result = dlg.GetSelections()
97                else:
98                    result = []
99            finally:
100                dlg.Destroy()
101        for i in result:
102            FoundData.append((filename,Pos[i],Banks[i]))
103    else:
104        dlg = wx.MessageDialog(self, 'ERROR - this is not a GSAS powder data file', 'No BANK records', wx.OK | wx.ICON_ERROR)
105        try:
106            result = dlg.ShowModal()
107        finally:
108            dlg.Destroy()
109    return FoundData,Iparm,Comments,Temperature
110
111def GetInstrumentFile(self,filename):
112    import os.path as op
113    dlg = wx.FileDialog(self,'Choose an instrument file','.', '', 'GSAS iparm file (*.prm)|*.prm|All files(*.*)|*.*', wx.OPEN)
114    if self.dirname: 
115        dlg.SetDirectory(self.dirname)
116        Tname = filename[:filename.index('.')]+'.prm'
117        if op.exists(Tname):
118            self.IparmName = Tname       
119    if self.IparmName: dlg.SetFilename(self.IparmName)
120    filename = ''
121    try:
122        if dlg.ShowModal() == wx.ID_OK:
123            filename = dlg.GetPath()
124    finally:
125        dlg.Destroy()
126    return filename
127
128def GetInstrumentData(IparmName):
129    file = open(IparmName, 'Ur')
130    S = 1
131    Iparm = {}
132    while S:
133        S = file.readline()
134        Iparm[S[:12]] = S[12:-1]
135    return Iparm
136   
137def GetPowderPeaks(fileName):
138    sind = lambda x: math.sin(x*math.pi/180.)
139    asind = lambda x: 180.*math.asin(x)/math.pi
140    Cuka = 1.54052
141    File = open(fileName,'Ur')
142    Comments = []
143    peaks = []
144    S = File.readline()
145    while S:
146        if S[:1] == '#':
147            Comments.append(S[:-1])
148        else:
149            item = S.split()
150            if len(item) == 1:
151                peaks.append([float(item[0]),1.0])
152            elif len(item) > 1:
153                peaks.append([float(item[0]),float(item[0])])
154        S = File.readline()
155    File.close()
156    if Comments:
157       print 'Comments on file:'
158       for Comment in Comments: print Comment
159    Peaks = []
160    if peaks[0][0] > peaks[-1][0]:          # d-spacings - assume CuKa
161        for peak in peaks:
162            dsp = peak[0]
163            sth = Cuka/(2.0*dsp)
164            if sth < 1.0:
165                tth = 2.0*asind(sth)
166            else:
167                break
168            Peaks.append([tth,peak[1],True,False,0,0,0,dsp,0.0])
169    else:                                   #2-thetas - assume Cuka (for now)
170        for peak in peaks:
171            tth = peak[0]
172            dsp = Cuka/(2.0*sind(tth/2.0))
173            Peaks.append([tth,peak[1],True,False,0,0,0,dsp,0.0])
174    return Comments,Peaks
175
176def GetPawleyPeaks(filename):
177    rt2ln2x2 = 2.35482
178    File = open(filename,'Ur')
179    PawleyPeaks = []
180    S = File.readline()         #skip header
181    S = File.readline()
182    item = S.split()
183    while S:
184        h,k,l = int(item[0]),int(item[1]),int(item[2])
185        mult = int(item[3])
186        tth = float(item[5])
187        sig = float(item[6])/rt2ln2x2
188        Iobs = float(item[7])*mult
189        PawleyPeaks.append([h,k,l,mult,tth,sig,False,Iobs,0.0,[]])
190        S = File.readline()
191        item = S.split()
192        if item[3] == '-100.0000':       #find trailer
193            break
194    File.close()
195    return PawleyPeaks
196   
197def GetHKLData(filename):
198    print 'Reading: '+filename
199    File = open(filename,'Ur')
200    HKLref = []
201    HKLmin = [1000,1000,1000]
202    HKLmax = [0,0,0]
203    FoMax = 0
204    ifFc = False
205    S = File.readline()
206    while '#' in S[0]:        #get past comments if any
207        S = File.readline()       
208    if '_' in S:         #cif style .hkl file
209        while 'loop_' not in S:         #skip preliminaries if any - can't have 'loop_' in them!
210            S = File.readline()       
211        S = File.readline()             #get past 'loop_' line
212        pos = 0
213        hpos = kpos = lpos = Fosqpos = Fcsqpos = sigpos = -1
214        while S:
215            if '_' in S:
216                if 'index_h' in S:
217                    hpos = pos
218                elif 'index_k' in S:
219                    kpos = pos
220                elif 'index_l' in S:
221                    lpos = pos
222                elif 'F_squared_meas' in S:
223                    Fosqpos = pos
224                elif 'F_squared_calc' in S:
225                    Fcsqpos = pos
226                elif 'F_squared_sigma' in S:
227                    sigpos = pos
228                pos += 1
229            else:
230                data = S.split()
231                if data:                    #avoid blank lines
232                    HKL = np.array([int(data[hpos]),int(data[kpos]),int(data[lpos])])
233                    h,k,l = HKL
234                    Fosq = float(data[Fosqpos])
235                    if sigpos != -1:
236                        sigFosq = float(data[sigpos])
237                    else:
238                        sigFosq = 1.
239                    if Fcsqpos != -1:
240                        Fcsq = float(data[Fcsqpos])
241                        if Fcsq:
242                            ifFc = True
243                    else:
244                        Fcsq = 0.
245                       
246                    HKLmin = [min(h,HKLmin[0]),min(k,HKLmin[1]),min(l,HKLmin[2])]
247                    HKLmax = [max(h,HKLmax[0]),max(k,HKLmax[1]),max(l,HKLmax[2])]
248                    FoMax = max(FoMax,Fosq)
249                    HKLref.append([HKL,Fosq,sigFosq,Fcsq,0,0,0])                 #room for Fcp, Fcpp & phase
250            S = File.readline()
251    else:                   #dumb h,k,l,Fo,sigFo .hkl file
252        while S:
253            h,k,l,Fo,sigFo = S.split()
254            HKL = np.array([int(h),int(k),int(l)])
255            h,k,l = HKL
256            Fo = float(Fo)
257            sigFo = float(sigFo)
258            HKLmin = [min(h,HKLmin[0]),min(k,HKLmin[1]),min(l,HKLmin[2])]
259            HKLmax = [max(h,HKLmax[0]),max(k,HKLmax[1]),max(l,HKLmax[2])]
260            FoMax = max(FoMax,Fo)
261            HKLref.append([HKL,Fo**2,2.*Fo*sigFo,0,0,0,0])                 #room for Fc, Fcp, Fcpp & phase
262            S = File.readline()
263    File.close()
264    return HKLref,HKLmin,HKLmax,FoMax,ifFc
265
266def GetPowderData(filename,Pos,Bank,DataType):
267    '''Reads one BANK of data from GSAS raw powder data file
268    input:
269    filename: GSAS raw powder file dataname
270    Pos: start of data in file just after BANK record
271    Bank: the BANK record
272    DataType: powder data type, e.g. "PXC" for Powder X-ray CW data
273    returns: list [x,y,e,yc,yb]
274    x: np.array of x-axis values
275    y: np.array of powder pattern intensities
276    w: np.array of w=sig(intensity)^2 values
277    yc: np.array of calc. intensities (zero)
278    yb: np.array of calc. background (zero)
279    yd: np.array of obs-calc profiles
280    '''
281    print 'Reading: '+filename
282    print 'Bank:    '+Bank[:-1]
283    if 'FXYE' in Bank:
284        return GetFXYEdata(filename,Pos,Bank,DataType)
285    elif 'FXY' in Bank:
286        return GetFXYdata(filename,Pos,Bank,DataType)
287    elif 'ESD' in Bank:
288        return GetESDdata(filename,Pos,Bank,DataType)
289    elif 'STD' in Bank:
290        return GetSTDdata(filename,Pos,Bank,DataType)
291    else:
292        return GetSTDdata(filename,Pos,Bank,DataType)
293    return []
294
295def GetFXYEdata(filename,Pos,Bank,DataType):
296    File = open(filename,'Ur')
297    File.seek(Pos)
298    x = []
299    y = []
300    w = []
301    S = File.readline()
302    while S and S[:4] != 'BANK':
303        vals = S.split()
304        if DataType[2] == 'C':
305            x.append(float(vals[0])/100.)               #CW: from centidegrees to degrees
306        elif DataType[2] == 'T':
307            x.append(float(vals[0])/1000.0)             #TOF: from musec to millisec
308        f = float(vals[1])
309        if f <= 0.0:
310            y.append(0.0)
311            w.append(1.0)
312        else:
313            y.append(float(vals[1]))
314            w.append(1.0/float(vals[2])**2)
315        S = File.readline()
316    File.close()
317    N = len(x)
318    return [np.array(x),np.array(y),np.array(w),np.zeros(N),np.zeros(N),np.zeros(N)]
319   
320def GetFXYdata(filename,Pos,Bank,DataType):
321    File = open(filename,'Ur')
322    File.seek(Pos)
323    x = []
324    y = []
325    w = []
326    S = File.readline()
327    while S and S[:4] != 'BANK':
328        vals = S.split()
329        if DataType[2] == 'C':
330            x.append(float(vals[0])/100.)               #CW: from centidegrees to degrees
331        elif DataType[2] == 'T':
332            x.append(float(vals[0])/1000.0)             #TOF: from musec to millisec
333        f = float(vals[1])
334        if f > 0.0:
335            y.append(f)
336            w.append(1.0/f)
337        else:             
338            y.append(0.0)
339            w.append(1.0)
340        S = File.readline()
341    File.close()
342    N = len(x)
343    return [np.array(x),np.array(y),np.array(w),np.zeros(N),np.zeros(N),np.zeros(N)]
344   
345def GetESDdata(filename,Pos,Bank,DataType):
346    File = open(filename,'Ur')
347    cons = Bank.split()
348    if DataType[2] == 'C':
349        start = float(cons[5])/100.0               #CW: from centidegrees to degrees
350        step = float(cons[6])/100.0
351    elif DataType[2] == 'T':
352        start = float(cons[5])/1000.0              #TOF: from musec to millisec
353        step = float(cons[6])/1000.0
354    File.seek(Pos)
355    x = []
356    y = []
357    w = []
358    S = File.readline()
359    j = 0
360    while S and S[:4] != 'BANK':
361        for i in range(0,80,16):
362            xi = start+step*j
363            yi = sfloat(S[i:i+8])
364            ei = sfloat(S[i+8:i+16])
365            x.append(xi)
366            if yi > 0.0:
367                y.append(yi)
368                w.append(1.0/ei**2)
369            else:             
370                y.append(0.0)
371                w.append(1.0)
372            j += 1
373        S = File.readline()
374    File.close()
375    N = len(x)
376    return [np.array(x),np.array(y),np.array(w),np.zeros(N),np.zeros(N),np.zeros(N)]
377
378def GetSTDdata(filename,Pos,Bank,DataType):
379    File = open(filename,'Ur')
380    cons = Bank.split()
381    Nch = cons[2]
382    if DataType[2] == 'C':
383        start = float(cons[5])/100.0               #CW: from centidegrees to degrees
384        step = float(cons[6])/100.0
385    elif DataType[2] == 'T':
386        start = float(cons[5])/1000.0              #TOF: from musec to millisec - not likely!
387        step = float(cons[6])/1000.0
388    File.seek(Pos)
389    x = []
390    y = []
391    w = []
392    S = File.readline()
393    j = 0
394    while S and S[:4] != 'BANK':
395        for i in range(0,80,8):
396            xi = start+step*j
397            ni = max(sint(S[i:i+2]),1)
398            yi = max(sfloat(S[i+2:i+8]),0.0)
399            if yi:
400                ei = math.sqrt(yi*ni)
401            else:
402                yi = 0.0
403                ei = 1.0
404            j += 1
405            if j < Nch:
406                x.append(xi)
407                y.append(yi)
408                w.append(1.0/ei**2)
409        S = File.readline()
410    File.close()
411    N = len(x)
412    return [np.array(x),np.array(y),np.array(w),np.zeros(N),np.zeros(N),np.zeros(N)]
413   
414def CheckImageFile(self,imagefile):
415    if not ospath.exists(imagefile):
416        dlg = wx.FileDialog(self, 'Bad image file name; choose name', '.', '',\
417        'MAR345 (*.mar3450;*.mar2300)|*.mar3450;*.mar2300|ADSC Image (*.img)\
418        |*.img|Detector tif (*.tif;*.tiff)|*.tif;*.tiff|GE Image sum (*.sum)\
419        |*.sum|GE Image avg (*.avg)|*.avg|GE Image raw (*)|*|All files (*.*)|*.*',wx.OPEN)
420        if self.dirname:
421            dlg.SetDirectory(self.dirname)
422        try:
423            dlg.SetFilename(ospath.split(imagefile)[1])
424            if dlg.ShowModal() == wx.ID_OK:
425                self.dirname = dlg.GetDirectory()
426                imagefile = dlg.GetPath()
427            else:
428                imagefile = False
429        finally:
430            dlg.Destroy()
431    return imagefile
432       
433def GetImageData(self,imagefile,imageOnly=False):       
434    ext = ospath.splitext(imagefile)[1]
435    Comments = []
436    if ext == '.tif':
437        Comments,Data,Npix,Image = GetTifData(imagefile)
438    elif ext == '.img':
439        Comments,Data,Npix,Image = GetImgData(imagefile)
440        Image[0][0] = 0
441    elif ext == '.mar3450' or ext == '.mar2300':
442        Comments,Data,Npix,Image = GetMAR345Data(imagefile)
443    elif ext in ['.sum','.avg','']:
444        Comments,Data,Npix,Image = GetGEsumData(imagefile)
445    elif ext == '.G2img':
446        return GetG2Image(imagefile)
447    if imageOnly:
448        return Image
449    else:
450        return Comments,Data,Npix,Image
451       
452def PutG2Image(filename,image):
453    File = open(filename,'wb')
454    cPickle.dump(image,File,1)
455    File.close()
456    return
457   
458def GetG2Image(filename):
459    File = open(filename,'rb')
460    image = cPickle.load(File)
461    File.close()
462    return image
463   
464def GetGEsumData(filename,imageOnly=False):
465    import array as ar
466    if not imageOnly:
467        print 'Read GE sum file: ',filename   
468    File = open(filename,'rb')
469    if '.sum' in filename:
470        head = ['GE detector sum data from APS 1-ID',]
471        sizexy = [2048,2047]
472    elif '.avg' in filename:
473        head = ['GE detector avg data from APS 1-ID',]
474        sizexy = [2048,2048]
475    else:
476        head = ['GE detector raw data from APS 1-ID',]
477        sizexy = [2048,2048]
478        pos = 8192
479        File.seek(pos)
480    Npix = sizexy[0]*sizexy[1]
481    if '.sum' in filename:
482        image = np.array(ar.array('f',File.read(4*Npix)),dtype=np.int32)
483    elif '.avg' in filename:
484        image = np.array(ar.array('H',File.read(2*Npix)),dtype=np.int32)
485    else:
486        image = np.array(ar.array('H',File.read(2*Npix)),dtype=np.int32)
487    image = np.reshape(image,(sizexy[1],sizexy[0]))
488    data = {'pixelSize':(200,200),'wavelength':0.15,'distance':250.0,'center':[204.8,204.8],'size':sizexy} 
489    File.close()   
490    if imageOnly:
491        return image
492    else:
493        return head,data,Npix,image
494       
495def GetImgData(filename,imageOnly=False):
496    import struct as st
497    import array as ar
498    if not imageOnly:
499        print 'Read ADSC img file: ',filename
500    File = open(filename,'rb')
501    head = File.read(511)
502    lines = head.split('\n')
503    head = []
504    center = [0,0]
505    for line in lines[1:-2]:
506        line = line.strip()[:-1]
507        if line:
508            if 'SIZE1' in line:
509                size = int(line.split('=')[1])
510                Npix = size*size
511            elif 'WAVELENGTH' in line:
512                wave = float(line.split('=')[1])
513            elif 'BIN' in line:
514                if line.split('=')[1] == '2x2':
515                    pixel=(102,102)
516                else:
517                    pixel = (51,51)
518            elif 'DISTANCE' in line:
519                distance = float(line.split('=')[1])
520            elif 'CENTER_X' in line:
521                center[0] = float(line.split('=')[1])
522            elif 'CENTER_Y' in line:
523                center[1] = float(line.split('=')[1])
524            head.append(line)
525    data = {'pixelSize':pixel,'wavelength':wave,'distance':distance,'center':center,'size':[size,size]}
526    image = []
527    row = 0
528    pos = 512
529    File.seek(pos)
530    image = np.array(ar.array('H',File.read(2*Npix)),dtype=np.int32)
531    image = np.reshape(image,(sizexy[1],sizexy[0]))
532#    image = np.zeros(shape=(size,size),dtype=np.int32)   
533#    while row < size:
534#        File.seek(pos)
535#        line = ar.array('H',File.read(2*size))
536#        image[row] = np.asarray(line)
537#        row += 1
538#        pos += 2*size
539    File.close()
540    if imageOnly:
541        return image
542    else:
543        return lines[1:-2],data,Npix,image
544       
545def GetMAR345Data(filename,imageOnly=False):
546    import array as ar
547    import struct as st
548    try:
549        import pack_f as pf
550    except:
551        msg = wx.MessageDialog(None, message="Unable to load the GSAS MAR image decompression, pack_f",
552                               caption="Import Error",
553                               style=wx.ICON_ERROR | wx.OK | wx.STAY_ON_TOP)
554        msg.ShowModal()
555        return None,None,None,None
556
557    if not imageOnly:
558        print 'Read Mar345 file: ',filename
559    File = open(filename,'rb')
560    head = File.read(4095)
561    numbers = st.unpack('<iiiiiiiiii',head[:40])
562    lines = head[128:].split('\n')
563    head = []
564    for line in lines:
565        line = line.strip()
566        if 'PIXEL' in line:
567            values = line.split()
568            pixel = (int(values[2]),int(values[4]))     #in microns
569        elif 'WAVELENGTH' in line:
570            wave = float(line.split()[1])
571        elif 'DISTANCE' in line:
572            distance = float(line.split()[1])           #in mm
573        elif 'CENTER' in line:
574            values = line.split()
575            center = [float(values[2])/10.,float(values[4])/10.]    #make in mm from pixels
576        if line: 
577            head.append(line)
578    data = {'pixelSize':pixel,'wavelength':wave,'distance':distance,'center':center}
579    for line in head:
580        if 'FORMAT' in line[0:6]:
581            items = line.split()
582            size = int(items[1])
583            Npix = size*size
584    pos = 4096
585    data['size'] = [size,size]
586    File.seek(pos)
587    line = File.read(8)
588    while 'CCP4' not in line:       #get past overflow list for now
589        line = File.read(8)
590        pos += 8
591    pos += 37
592    File.seek(pos)
593    raw = File.read()
594    File.close()
595    image = np.zeros(shape=(size,size),dtype=np.int32)
596    image = pf.pack_f(len(raw),raw,size,image)
597    if imageOnly:
598        return image.T              #transpose to get it right way around
599    else:
600        return head,data,Npix,image.T
601       
602def GetTifData(filename,imageOnly=False):
603    import struct as st
604    import array as ar
605    File = open(filename,'rb')
606    dataType = 5
607    try:
608        Meta = open(filename+'.metadata','Ur')
609        head = Meta.readlines()
610        for line in head:
611            line = line.strip()
612            if 'dataType' in line:
613                dataType = int(line.split('=')[1])
614        Meta.close()
615    except IOError:
616        print 'no metadata file found - will try to read file anyway'
617        head = ['no metadata file found',]
618       
619    tag = File.read(2)
620    byteOrd = '<'
621    if tag == 'II' and int(st.unpack('<h',File.read(2))[0]) == 42:     #little endian
622        IFD = int(st.unpack(byteOrd+'i',File.read(4))[0])
623    elif tag == 'MM' and int(st.unpack('>h',File.read(2))[0]) == 42:   #big endian
624        byteOrd = '>'
625        IFD = int(st.unpack(byteOrd+'i',File.read(4))[0])       
626    else:
627        lines = ['not a detector tiff file',]
628        return lines,0,0,0
629    File.seek(IFD)                                                  #get number of directory entries
630    NED = int(st.unpack(byteOrd+'h',File.read(2))[0])
631    IFD = {}
632    for ied in range(NED):
633        Tag,Type = st.unpack(byteOrd+'Hh',File.read(4))
634        nVal = st.unpack(byteOrd+'i',File.read(4))[0]
635        if Type == 1:
636            Value = st.unpack(byteOrd+nVal*'b',File.read(nVal))
637        elif Type == 2:
638            Value = st.unpack(byteOrd+'i',File.read(4))
639        elif Type == 3:
640            Value = st.unpack(byteOrd+nVal*'i',File.read(nVal*4))
641        elif Type == 4:
642            Value = st.unpack(byteOrd+nVal*'i',File.read(nVal*4))
643        elif Type == 5:
644            Value = st.unpack(byteOrd+nVal*'i',File.read(nVal*4))
645        elif Type == 11:
646            Value = st.unpack(byteOrd+nVal*'f',File.read(nVal*4))
647        IFD[Tag] = [Type,nVal,Value]
648    sizexy = [IFD[256][2][0],IFD[257][2][0]]
649    [nx,ny] = sizexy
650    Npix = nx*ny
651    if 272 in IFD:
652        ifd = IFD[272]
653        File.seek(ifd[2][0])
654        S = File.read(ifd[1])
655        if 'PILATUS' in S:
656            tifType = 'Pilatus'
657            dataType = 0
658            pixy = (172,172)
659            File.seek(4096)
660            if not imageOnly:
661                print 'Read Pilatus tiff file: ',filename
662            image = ar.array('L',File.read(4*Npix))
663            image = np.array(np.asarray(image),dtype=np.int32)
664    elif 262 in IFD and IFD[262][2][0] > 4:
665        tifType = 'DND'
666        pixy = (158,158)
667        File.seek(512)
668        if not imageOnly:
669            print 'Read DND SAX/WAX-detector tiff file: ',filename
670        image = np.array(ar.array('H',File.read(2*Npix)),dtype=np.int32)
671    elif sizexy == [1536,1536]:
672        tifType = 'APS Gold'
673        pixy = (150,150)
674        File.seek(64)
675        if not imageOnly:
676            print 'Read Gold tiff file:',filename
677        image = np.array(ar.array('H',File.read(2*Npix)),dtype=np.int32)
678    elif sizexy == [2048,2048] or sizexy == [1024,1024]:
679        if IFD[273][2][0] == 8:
680            if IFD[258][2][0] == 32:
681                tifType = 'PE'
682                pixy = (200,200)
683                File.seek(8)
684                if not imageOnly:
685                    print 'Read APS PE-detector tiff file: ',filename
686                if dataType == 5:
687                    image = np.array(ar.array('f',File.read(4*Npix)),dtype=np.int32)
688                else:
689                    image = np.array(ar.array('I',File.read(4*Npix)),dtype=np.int32)
690        elif IFD[273][2][0] == 4096:
691            tifType = 'MAR'
692            pixy = (158,158)
693            File.seek(4096)
694            if not imageOnly:
695                print 'Read MAR CCD tiff file: ',filename
696            image = np.array(ar.array('H',File.read(2*Npix)),dtype=np.int32)
697           
698    else:
699        lines = ['not a known detector tiff file',]
700        return lines,0,0,0
701       
702    image = np.reshape(image,(sizexy[1],sizexy[0]))
703    center = [pixy[0]*sizexy[0]/2000,pixy[1]*sizexy[1]/2000]
704    data = {'pixelSize':pixy,'wavelength':0.10,'distance':100.0,'center':center,'size':sizexy}
705    File.close()   
706    if imageOnly:
707        return image
708    else:
709        return head,data,Npix,image
710   
711def ProjFileOpen(self):
712    file = open(self.GSASprojectfile,'rb')
713    print 'load from file: ',self.GSASprojectfile
714    wx.BeginBusyCursor()
715    try:
716        while True:
717            try:
718                data = cPickle.load(file)
719            except EOFError:
720                break
721            datum = data[0]
722            print 'load: ',datum[0]
723           
724            Id = self.PatternTree.AppendItem(parent=self.root,text=datum[0])
725            if 'PWDR' in datum[0]:               
726                self.PatternTree.SetItemPyData(Id,datum[1][:3])     #temp. trim off junk
727            else:
728                self.PatternTree.SetItemPyData(Id,datum[1])
729            for datus in data[1:]:
730                print '    load: ',datus[0]
731                               
732                sub = self.PatternTree.AppendItem(Id,datus[0])
733                self.PatternTree.SetItemPyData(sub,datus[1])
734                                               
735            if 'IMG' in datum[0]:                   #retreive image default flag & data if set
736                Data = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,Id,'Image Controls'))
737                if Data['setDefault']:
738                    self.imageDefault = Data               
739        file.close()
740       
741    finally:
742        wx.EndBusyCursor()
743    print 'project load successful'
744    self.NewPlot = True
745   
746def ProjFileSave(self):
747    if not self.PatternTree.IsEmpty():
748        file = open(self.GSASprojectfile,'wb')
749        print 'save to file: ',self.GSASprojectfile
750        wx.BeginBusyCursor()
751        try:
752            item, cookie = self.PatternTree.GetFirstChild(self.root)
753            while item:
754                data = []
755                name = self.PatternTree.GetItemText(item)
756                print 'save: ',name
757                data.append([name,self.PatternTree.GetItemPyData(item)])
758                item2, cookie2 = self.PatternTree.GetFirstChild(item)
759                while item2:
760                    name = self.PatternTree.GetItemText(item2)
761                    print '    save: ',name
762                    data.append([name,self.PatternTree.GetItemPyData(item2)])
763                    item2, cookie2 = self.PatternTree.GetNextChild(item, cookie2)                           
764                item, cookie = self.PatternTree.GetNextChild(self.root, cookie)                           
765                cPickle.dump(data,file,1)
766            file.close()
767        finally:
768            wx.EndBusyCursor()
769        print 'project save successful'
770       
771def SaveIntegration(self,PickId,data):
772    azms = self.Integrate[1]
773    X = self.Integrate[2][:-1]
774    Xminmax = [X[0],X[-1]]
775    N = len(X)
776    Id = self.PatternTree.GetItemParent(PickId)
777    name = self.PatternTree.GetItemText(Id)
778    name = name.replace('IMG ','PWDR ')
779    Comments = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,Id, 'Comments'))
780    names = ['Type','Lam','Zero','Polariz.','U','V','W','X','Y','SH/L','Azimuth'] 
781    codes = [0 for i in range(11)]
782    parms = ['PXC',data['wavelength'],0.0,0.0,1.0,-1.0,0.3,0.0,1.0,0.0,0.0]
783    Azms = [(azms[i+1]+azms[i])/2. for i in range(len(azms)-1)]
784    for i,azm in enumerate(Azms):
785        item, cookie = self.PatternTree.GetFirstChild(self.root)
786        Id = 0
787        while item:
788            Name = self.PatternTree.GetItemText(item)
789            if name == Name:
790                Id = item
791            item, cookie = self.PatternTree.GetNextChild(self.root, cookie)
792        parms[10] = azm
793        Y = self.Integrate[0][i]
794        W = np.sqrt(Y)
795        Sample = {'Scale':[1.0,True],'Type':'Debye-Scherrer','Absorption':[0.0,False],'DisplaceX':[0.0,False],
796            'DisplaceY':[0.0,False],'Diffuse':[],'Temperature':300.,'Pressure':1.0,'Humidity':0.0,'Voltage':0.0,'Force':0.0}
797        if Id:
798            self.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(self,Id, 'Comments'),Comments)                   
799            self.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(self,Id,'Limits'),[tuple(Xminmax),Xminmax])
800            self.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(self,Id,'Background'),[['chebyschev',1,3,1.0,0.0,0.0]])
801            self.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(self,Id,'Instrument Parameters'),[tuple(parms),parms,codes,names])
802            self.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(self,Id,'Peak List'),[])
803            self.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(self,Id,'Index Peak List'),[])
804            self.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(self,Id,'Unit Cells List'),[])             
805        else:
806            Id = self.PatternTree.AppendItem(parent=self.root,text=name+" Azm= %.2f"%(azm))
807            self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='Comments'),Comments)                   
808            self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='Limits'),[tuple(Xminmax),Xminmax])
809            self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='Background'),[['chebyschev',1,3,1.0,0.0,0.0]])
810            self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='Instrument Parameters'),[tuple(parms),parms,codes,names])
811            self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='Sample Parameters'),Sample)
812            self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='Peak List'),[])
813            self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='Index Peak List'),[])
814            self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='Unit Cells List'),[])             
815        self.PatternTree.SetItemPyData(Id,[[''],[np.array(X),np.array(Y),np.array(W),np.zeros(N),np.zeros(N),np.zeros(N)]])
816    self.PatternTree.SelectItem(Id)
817    self.PatternTree.Expand(Id)
818    self.PatternId = Id
819           
820def powderFxyeSave(self,powderfile):
821    file = open(powderfile,'w')
822    prm = open(powderfile.strip('fxye')+'prm','w')      #old style GSAS parm file
823    print 'save powder pattern to file: ',powderfile
824    wx.BeginBusyCursor()
825    Inst = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self, \
826                    self.PickId, 'Instrument Parameters'))[1]
827    if len(Inst) == 11:             #single wavelength
828        lam1 = Inst[1]
829        lam2 = 0.0
830        GU,GV,GW = Inst[4:7]
831        LX,LY = Inst[7:9]
832        SL = HL = Inst[9]/2.0   
833    else:                           #Ka1 & Ka2
834        lam1 = Inst[1]
835        lam2 = Inst[2]
836        GU,GV,GW = Inst[6:9]
837        LX,LY = Inst[9:11]
838        SL = HL = Inst[11]/2.0   
839    prm.write( '            123456789012345678901234567890123456789012345678901234567890        '+'\n')
840    prm.write( 'INS   BANK      1                                                               '+'\n')
841    prm.write( 'INS   HTYPE   PXCR                                                              '+'\n')
842    prm.write(('INS  1 ICONS%10.7f%10.7f    0.0000               0.990    0     0.500   '+'\n')%(lam1,lam2))
843    prm.write( 'INS  1 IRAD     0                                                               '+'\n')
844    prm.write( 'INS  1I HEAD                                                                    '+'\n')
845    prm.write( 'INS  1I ITYP    0    0.0000  180.0000         1                                 '+'\n')
846    prm.write( 'INS  1PRCF1     3    8   0.00100                                                '+'\n')
847    prm.write(('INS  1PRCF11     %15.6g%15.6g%15.6g%15.6g   '+'\n')%(GU,GV,GW,0.0))
848    prm.write(('INS  1PRCF12     %15.6g%15.6g%15.6g%15.6g   '+'\n')%(LX,LY,SL,HL))
849    prm.close()
850    try:
851        x,y,w,yc,yb,yd = self.PatternTree.GetItemPyData(self.PickId)[1]
852        file.write(powderfile+'\n')
853        file.write('BANK 1 %d %d CONS %.2f %.2f 0 0 FXYE\n'%(len(x),len(x),\
854            100.*x[0],100.*(x[1]-x[0])))
855        s = list(np.sqrt(1./np.array(w)))       
856        XYW = zip(x,y,s)
857        for X,Y,S in XYW:
858            file.write("%15.6g %15.6g %15.6g\n" % (100.*X,Y,S))
859        file.close()
860    finally:
861        wx.EndBusyCursor()
862    print 'powder pattern file written'
863       
864def powderXyeSave(self,powderfile):
865    file = open(powderfile,'w')
866    print 'save powder pattern to file: ',powderfile
867    wx.BeginBusyCursor()
868    try:
869        x,y,w,yc,yb,yd = self.PatternTree.GetItemPyData(self.PickId)[1]
870        XYW = zip(x,y,w)
871        for X,Y,W in XYW:
872            file.write("%15.6g %15.6g %15.6g\n" % (X,Y,W))
873        file.close()
874    finally:
875        wx.EndBusyCursor()
876    print 'powder pattern file written'
877   
878def PeakListSave(self,file,peaks):
879    print 'save peak list to file: ',self.peaklistfile
880    if not peaks:
881        dlg = wx.MessageDialog(self, 'No peaks!', 'Nothing to save!', wx.OK)
882        try:
883            result = dlg.ShowModal()
884        finally:
885            dlg.Destroy()
886        return
887    for peak in peaks:
888        file.write("%10.4f %12.2f %10.3f %10.3f \n" % \
889            (peak[0],peak[2],peak[4],peak[6]))
890    print 'peak list saved'
891             
892def IndexPeakListSave(self,peaks):
893    file = open(self.peaklistfile,'wa')
894    print 'save index peak list to file: ',self.peaklistfile
895    wx.BeginBusyCursor()
896    try:
897        if not peaks:
898            dlg = wx.MessageDialog(self, 'No peaks!', 'Nothing to save!', wx.OK)
899            try:
900                result = dlg.ShowModal()
901            finally:
902                dlg.Destroy()
903            return
904        for peak in peaks:
905            file.write("%12.6f\n" % (peak[7]))
906        file.close()
907    finally:
908        wx.EndBusyCursor()
909    print 'index peak list saved'
910   
911def ReadEXPPhase(self,filename):
912    file = open(filename, 'Ur')
913    Phase = {}
914    S = 1
915    Expr = [{},{},{},{},{},{},{},{},{}]
916    while S:
917        S = file.readline()
918        if 'EXPR NPHAS' in S[:12]:
919            Num = S[12:-1].count('0')
920            NPhas = S[12:-1].split()
921        if 'CRS' in S[:3]:
922            N = int(S[3:4])-1
923            Expr[N][S[:12]] = S[12:-1]
924    file.close()
925    PNames = []
926    for n,N in enumerate(NPhas):
927        if N != '0':
928            result = n
929            key = 'CRS'+str(n+1)+'    PNAM'
930            PNames.append(Expr[n][key])
931    if Num < 8:
932        dlg = wx.SingleChoiceDialog(self, 'Which phase to read?', 'Read phase data', PNames, wx.CHOICEDLG_STYLE)
933        try:
934            if dlg.ShowModal() == wx.ID_OK:
935                result = dlg.GetSelection()
936        finally:
937            dlg.Destroy()       
938    EXPphase = Expr[result]
939    keyList = EXPphase.keys()
940    keyList.sort()
941    SGData = {}
942    if NPhas[result] == '1':
943        Ptype = 'nuclear'
944    elif NPhas[result] in ['2','3']:
945        Ptype = 'magnetic'
946    elif NPhas[result] == '4':
947        Ptype = 'macromolecular'
948    elif NPhas[result] == '10':
949        Ptype = 'Pawley'
950    for key in keyList:
951        if 'PNAM' in key:
952           PhaseName = EXPphase[key].strip()
953        elif 'ABC   ' in key:
954            abc = [float(EXPphase[key][:10]),float(EXPphase[key][10:20]),float(EXPphase[key][20:30])]                       
955        elif 'ANGLES' in key:
956            angles = [float(EXPphase[key][:10]),float(EXPphase[key][10:20]),float(EXPphase[key][20:30])]                                               
957        elif 'SG SYM' in key:
958            SpGrp = EXPphase[key][:15].strip()
959            E,SGData = G2spc.SpcGroup(SpGrp)
960    Atoms = []
961    if Ptype == 'nuclear':
962        for key in keyList:
963            if 'AT' in key:
964                if key[11:] == 'A':
965                    S = EXPphase[key]
966                elif key[11:] == 'B':
967                    S += EXPphase[key]
968                    Atom = [S[50:58].strip(),S[:10].strip(),'',
969                        float(S[10:20]),float(S[20:30]),float(S[30:40]),
970                        float(S[40:50]),'',int(S[60:62]),S[130:131]]
971                    if Atom[9] == 'I':
972                        Atom += [float(S[68:78]),0.,0.,0.,0.,0.,0.]
973                    elif Atom[9] == 'A':
974                        Atom += [0.0,float(S[68:78]),float(S[78:88]),
975                            float(S[88:98]),float(S[98:108]),
976                            float(S[108:118]),float(S[118:128])]
977                    XYZ = Atom[3:6]
978                    Atom[7],Atom[8] = G2spc.SytSym(XYZ,SGData)
979                    Atom.append(ran.randint(0,sys.maxint))
980                    Atoms.append(Atom)
981    elif Ptype == 'macromolecular':
982        for key in keyList:
983            if 'AT' in key[6:8]:
984                S = EXPphase[key]
985                Atom = [int(S[56:60]),S[50:54].strip().upper(),S[54:56],
986                    S[46:51].strip(),S[:8].strip(),'',
987                    float(S[16:24]),float(S[24:32]),float(S[32:40]),
988                    float(S[8:16]),'1',1,'I',float(S[40:46]),0,0,0,0,0,0]
989                XYZ = Atom[6:9]
990                Atom[10],Atom[11] = G2spc.SytSym(XYZ,SGData)
991                Atom.append(ran.randint(0,sys.maxint))
992                Atoms.append(Atom)
993    Volume = G2lat.calc_V(G2lat.cell2A(abc+angles))
994    Phase['General'] = {'Name':PhaseName,'Type':Ptype,'SGData':SGData,
995        'Cell':[False,]+abc+angles+[Volume,]}
996    Phase['Atoms'] = Atoms
997    Phase['Drawing'] = {}
998    Phase['Histograms'] = {}
999    return Phase
1000       
1001def ReadPDBPhase(filename):
1002    EightPiSq = 8.*math.pi**2
1003    file = open(filename, 'Ur')
1004    Phase = {}
1005    Title = ''
1006    Compnd = ''
1007    Atoms = []
1008    A = np.zeros(shape=(3,3))
1009    S = file.readline()
1010    while S:
1011        Atom = []
1012        if 'TITLE' in S[:5]:
1013            Title = S[10:72].strip()
1014            S = file.readline()
1015        elif 'COMPND    ' in S[:10]:
1016            Compnd = S[10:72].strip()
1017            S = file.readline()
1018        elif 'CRYST' in S[:5]:
1019            abc = S[7:34].split()
1020            angles = S[34:55].split()
1021            cell=[float(abc[0]),float(abc[1]),float(abc[2]),
1022                float(angles[0]),float(angles[1]),float(angles[2])]
1023            Volume = G2lat.calc_V(G2lat.cell2A(cell))
1024            AA,AB = G2lat.cell2AB(cell)
1025            SpGrp = S[55:65]
1026            E,SGData = G2spc.SpcGroup(SpGrp)
1027            if E: 
1028                print ' ERROR in space group symbol ',SpGrp,' in file ',filename
1029                print ' N.B.: make sure spaces separate axial fields in symbol' 
1030                print G2spc.SGErrors(E)
1031                return None
1032            SGlines = G2spc.SGPrint(SGData)
1033            for line in SGlines: print line
1034            S = file.readline()
1035        elif 'SCALE' in S[:5]:
1036            V = (S[10:41].split())
1037            A[int(S[5])-1] = [float(V[0]),float(V[1]),float(V[2])]
1038            S = file.readline()
1039        elif 'ATOM' in S[:4] or 'HETATM' in S[:6]:
1040            XYZ = [float(S[31:39]),float(S[39:47]),float(S[47:55])]
1041            XYZ = np.inner(AB,XYZ)
1042            SytSym,Mult = G2spc.SytSym(XYZ,SGData)
1043            Uiso = float(S[61:67])/EightPiSq
1044            Type = S[12:14].upper()
1045            if Type[0] in '123456789':
1046                Type = Type[1:]
1047            Atom = [S[22:27].strip(),S[17:20].upper(),S[20:22],
1048                S[12:17].strip(),Type.strip(),'',XYZ[0],XYZ[1],XYZ[2],
1049                float(S[55:61]),SytSym,Mult,'I',Uiso,0,0,0,0,0,0]
1050            S = file.readline()
1051            if 'ANISOU' in S[:6]:
1052                Uij = S[30:72].split()
1053                Uij = [float(Uij[0])/10000.,float(Uij[1])/10000.,float(Uij[2])/10000.,
1054                    float(Uij[3])/10000.,float(Uij[4])/10000.,float(Uij[5])/10000.]
1055                Atom = Atom[:14]+Uij
1056                Atom[12] = 'A'
1057                S = file.readline()
1058            Atom.append(ran.randint(0,sys.maxint))
1059            Atoms.append(Atom)
1060        else:           
1061            S = file.readline()
1062    file.close()
1063    if Title:
1064        PhaseName = Title
1065    elif Compnd:
1066        PhaseName = Compnd
1067    else:
1068        PhaseName = 'None'
1069    Phase['General'] = {'Name':PhaseName,'Type':'macromolecular','SGData':SGData,
1070        'Cell':[False,]+cell+[Volume,]}
1071    Phase['Atoms'] = Atoms
1072    Phase['Drawing'] = {}
1073    Phase['Histograms'] = {}
1074   
1075    return Phase
1076   
1077def ReadCIFPhase(filename):
1078    anisoNames = ['aniso_u_11','aniso_u_22','aniso_u_33','aniso_u_12','aniso_u_13','aniso_u_23']
1079    file = open(filename, 'Ur')
1080    Phase = {}
1081    Title = ospath.split(filename)[-1]
1082    print '\n Reading cif file: ',Title
1083    Compnd = ''
1084    Atoms = []
1085    A = np.zeros(shape=(3,3))
1086    S = file.readline()
1087    while S:
1088        if '_symmetry_space_group_name_H-M' in S:
1089            SpGrp = S.split("_symmetry_space_group_name_H-M")[1].strip().strip('"').strip("'")
1090            E,SGData = G2spc.SpcGroup(SpGrp)
1091            if E:
1092                print ' ERROR in space group symbol ',SpGrp,' in file ',filename
1093                print ' N.B.: make sure spaces separate axial fields in symbol' 
1094                print G2spc.SGErrors(E)
1095                return None
1096            S = file.readline()
1097        elif '_cell' in S:
1098            if '_cell_length_a' in S:
1099                a = S.split('_cell_length_a')[1].strip().strip('"').strip("'").split('(')[0]
1100            elif '_cell_length_b' in S:
1101                b = S.split('_cell_length_b')[1].strip().strip('"').strip("'").split('(')[0]
1102            elif '_cell_length_c' in S:
1103                c = S.split('_cell_length_c')[1].strip().strip('"').strip("'").split('(')[0]
1104            elif '_cell_angle_alpha' in S:
1105                alp = S.split('_cell_angle_alpha')[1].strip().strip('"').strip("'").split('(')[0]
1106            elif '_cell_angle_beta' in S:
1107                bet = S.split('_cell_angle_beta')[1].strip().strip('"').strip("'").split('(')[0]
1108            elif '_cell_angle_gamma' in S:
1109                gam = S.split('_cell_angle_gamma')[1].strip().strip('"').strip("'").split('(')[0]
1110            S = file.readline()
1111        elif 'loop_' in S:
1112            labels = {}
1113            i = 0
1114            while S:
1115                S = file.readline()
1116                if '_atom_site' in S.strip()[:10]:
1117                    labels[S.strip().split('_atom_site_')[1].lower()] = i
1118                    i += 1
1119                else:
1120                    break
1121            if labels:
1122                if 'aniso_label' not in labels:
1123                    while S:
1124                        atom = ['','','',0,0,0,0,'','','I',0.01,0,0,0,0,0,0]
1125                        S.strip()
1126                        if len(S.split()) != len(labels):
1127                            if 'loop_' in S:
1128                                break
1129                            S += file.readline().strip()
1130                        data = S.split()
1131                        if len(data) != len(labels):
1132                            break
1133                        for key in labels:
1134                            if key == 'type_symbol':
1135                                atom[1] = data[labels[key]]
1136                            elif key == 'label':
1137                                atom[0] = data[labels[key]]
1138                            elif key == 'fract_x':
1139                                atom[3] = float(data[labels[key]].split('(')[0])
1140                            elif key == 'fract_y':
1141                                atom[4] = float(data[labels[key]].split('(')[0])
1142                            elif key == 'fract_z':
1143                                atom[5] = float(data[labels[key]].split('(')[0])
1144                            elif key == 'occupancy':
1145                                atom[6] = float(data[labels[key]].split('(')[0])
1146                            elif key == 'thermal_displace_type':
1147                                if data[labels[key]].lower() == 'uiso':
1148                                    atom[9] = 'I'
1149                                    atom[10] = float(data[labels['u_iso_or_equiv']].split('(')[0])
1150                                else:
1151                                    atom[9] = 'A'
1152                                    atom[10] = 0.0
1153                                   
1154                        atom[7],atom[8] = G2spc.SytSym(atom[3:6],SGData)
1155                        atom.append(ran.randint(0,sys.maxint))
1156                        Atoms.append(atom)
1157                        S = file.readline()
1158                else:
1159                    while S:
1160                        S.strip()
1161                        data = S.split()
1162                        if len(data) != len(labels):
1163                            break
1164                        name = data[labels['aniso_label']]
1165                        for atom in Atoms:
1166                            if name == atom[0]:
1167                                for i,uname in enumerate(anisoNames):
1168                                    atom[i+11] = float(data[labels[uname]].split('(')[0])
1169                        S = file.readline()
1170                                                                       
1171        else:           
1172            S = file.readline()
1173    file.close()
1174    if Title:
1175        PhaseName = Title
1176    else:
1177        PhaseName = 'None'
1178    SGlines = G2spc.SGPrint(SGData)
1179    for line in SGlines: print line
1180    cell = [float(a),float(b),float(c),float(alp),float(bet),float(gam)]
1181    Volume = G2lat.calc_V(G2lat.cell2A(cell))
1182    Phase['General'] = {'Name':PhaseName,'Type':'nuclear','SGData':SGData,
1183        'Cell':[False,]+cell+[Volume,]}
1184    Phase['Atoms'] = Atoms
1185    Phase['Drawing'] = {}
1186    Phase['Histograms'] = {}
1187   
1188    return Phase
Note: See TracBrowser for help on using the repository browser.