source: trunk/GSASIIIO.py @ 244

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

fix to reading GEsum data - made "memory error"s
improve read of missing image dialog
GSASIIplot.py now has a commented image size print line

  • 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-12 16:26:33 +0000 (Sat, 12 Feb 2011) $
6# $Author: vondreele $
7# $Revision: 244 $
8# $URL: trunk/GSASIIIO.py $
9# $Id: GSASIIIO.py 244 2011-02-12 16:26:33Z 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        'Any image file (*.tif;*.tiff;*.mar*;*.avg;*.sum;*.img)\
418        |*.tif;*.tiff;*.mar*;*.avg;*.sum;*.img|\
419        Any detector tif (*.tif;*.tiff)|*.tif;*.tiff|\
420        MAR file (*.mar*)|*.mar*|\
421        GE Image (*.avg;*.sum)|*.avg;*.sum|\
422        ADSC Image (*.img)|*.img|\
423        All files (*.*)|*.*',wx.OPEN)
424        if self.dirname:
425            dlg.SetDirectory(self.dirname)
426        try:
427            dlg.SetFilename(ospath.split(imagefile)[1])
428            if dlg.ShowModal() == wx.ID_OK:
429                self.dirname = dlg.GetDirectory()
430                imagefile = dlg.GetPath()
431            else:
432                imagefile = False
433        finally:
434            dlg.Destroy()
435    return imagefile
436       
437def GetImageData(self,imagefile,imageOnly=False):       
438    ext = ospath.splitext(imagefile)[1]
439    Comments = []
440    if ext == '.tif':
441        Comments,Data,Npix,Image = GetTifData(imagefile)
442    elif ext == '.img':
443        Comments,Data,Npix,Image = GetImgData(imagefile)
444        Image[0][0] = 0
445    elif ext == '.mar3450' or ext == '.mar2300':
446        Comments,Data,Npix,Image = GetMAR345Data(imagefile)
447    elif ext in ['.sum','.avg','']:
448        Comments,Data,Npix,Image = GetGEsumData(imagefile)
449    elif ext == '.G2img':
450        return GetG2Image(imagefile)
451    if imageOnly:
452        return Image
453    else:
454        return Comments,Data,Npix,Image
455       
456def PutG2Image(filename,image):
457    File = open(filename,'wb')
458    cPickle.dump(image,File,1)
459    File.close()
460    return
461   
462def GetG2Image(filename):
463    File = open(filename,'rb')
464    image = cPickle.load(File)
465    File.close()
466    return image
467   
468def GetGEsumData(filename,imageOnly=False):
469    import array as ar
470    if not imageOnly:
471        print 'Read GE sum file: ',filename   
472    File = open(filename,'rb')
473    if '.sum' in filename:
474        head = ['GE detector sum data from APS 1-ID',]
475        sizexy = [2048,2048]
476    elif '.avg' in filename:
477        head = ['GE detector avg data from APS 1-ID',]
478        sizexy = [2048,2048]
479    else:
480        head = ['GE detector raw data from APS 1-ID',]
481        sizexy = [2048,2048]
482        pos = 8192
483        File.seek(pos)
484    Npix = sizexy[0]*sizexy[1]
485    if '.sum' in filename:
486        image = np.array(ar.array('f',File.read(4*Npix)),dtype=np.int32)
487    elif '.avg' in filename:
488        image = np.array(ar.array('H',File.read(2*Npix)),dtype=np.int32)
489    else:
490        image = np.array(ar.array('H',File.read(2*Npix)),dtype=np.int32)
491    image = np.reshape(image,(sizexy[1],sizexy[0]))
492    data = {'pixelSize':(200,200),'wavelength':0.15,'distance':250.0,'center':[204.8,204.8],'size':sizexy} 
493    File.close()   
494    if imageOnly:
495        return image
496    else:
497        return head,data,Npix,image
498       
499def GetImgData(filename,imageOnly=False):
500    import struct as st
501    import array as ar
502    if not imageOnly:
503        print 'Read ADSC img file: ',filename
504    File = open(filename,'rb')
505    head = File.read(511)
506    lines = head.split('\n')
507    head = []
508    center = [0,0]
509    for line in lines[1:-2]:
510        line = line.strip()[:-1]
511        if line:
512            if 'SIZE1' in line:
513                size = int(line.split('=')[1])
514                Npix = size*size
515            elif 'WAVELENGTH' in line:
516                wave = float(line.split('=')[1])
517            elif 'BIN' in line:
518                if line.split('=')[1] == '2x2':
519                    pixel=(102,102)
520                else:
521                    pixel = (51,51)
522            elif 'DISTANCE' in line:
523                distance = float(line.split('=')[1])
524            elif 'CENTER_X' in line:
525                center[0] = float(line.split('=')[1])
526            elif 'CENTER_Y' in line:
527                center[1] = float(line.split('=')[1])
528            head.append(line)
529    data = {'pixelSize':pixel,'wavelength':wave,'distance':distance,'center':center,'size':[size,size]}
530    image = []
531    row = 0
532    pos = 512
533    File.seek(pos)
534    image = np.array(ar.array('H',File.read(2*Npix)),dtype=np.int32)
535    image = np.reshape(image,(sizexy[1],sizexy[0]))
536#    image = np.zeros(shape=(size,size),dtype=np.int32)   
537#    while row < size:
538#        File.seek(pos)
539#        line = ar.array('H',File.read(2*size))
540#        image[row] = np.asarray(line)
541#        row += 1
542#        pos += 2*size
543    File.close()
544    if imageOnly:
545        return image
546    else:
547        return lines[1:-2],data,Npix,image
548       
549def GetMAR345Data(filename,imageOnly=False):
550    import array as ar
551    import struct as st
552    try:
553        import pack_f as pf
554    except:
555        msg = wx.MessageDialog(None, message="Unable to load the GSAS MAR image decompression, pack_f",
556                               caption="Import Error",
557                               style=wx.ICON_ERROR | wx.OK | wx.STAY_ON_TOP)
558        msg.ShowModal()
559        return None,None,None,None
560
561    if not imageOnly:
562        print 'Read Mar345 file: ',filename
563    File = open(filename,'rb')
564    head = File.read(4095)
565    numbers = st.unpack('<iiiiiiiiii',head[:40])
566    lines = head[128:].split('\n')
567    head = []
568    for line in lines:
569        line = line.strip()
570        if 'PIXEL' in line:
571            values = line.split()
572            pixel = (int(values[2]),int(values[4]))     #in microns
573        elif 'WAVELENGTH' in line:
574            wave = float(line.split()[1])
575        elif 'DISTANCE' in line:
576            distance = float(line.split()[1])           #in mm
577        elif 'CENTER' in line:
578            values = line.split()
579            center = [float(values[2])/10.,float(values[4])/10.]    #make in mm from pixels
580        if line: 
581            head.append(line)
582    data = {'pixelSize':pixel,'wavelength':wave,'distance':distance,'center':center}
583    for line in head:
584        if 'FORMAT' in line[0:6]:
585            items = line.split()
586            size = int(items[1])
587            Npix = size*size
588    pos = 4096
589    data['size'] = [size,size]
590    File.seek(pos)
591    line = File.read(8)
592    while 'CCP4' not in line:       #get past overflow list for now
593        line = File.read(8)
594        pos += 8
595    pos += 37
596    File.seek(pos)
597    raw = File.read()
598    File.close()
599    image = np.zeros(shape=(size,size),dtype=np.int32)
600    image = pf.pack_f(len(raw),raw,size,image)
601    if imageOnly:
602        return image.T              #transpose to get it right way around
603    else:
604        return head,data,Npix,image.T
605       
606def GetTifData(filename,imageOnly=False):
607    import struct as st
608    import array as ar
609    File = open(filename,'rb')
610    dataType = 5
611    try:
612        Meta = open(filename+'.metadata','Ur')
613        head = Meta.readlines()
614        for line in head:
615            line = line.strip()
616            if 'dataType' in line:
617                dataType = int(line.split('=')[1])
618        Meta.close()
619    except IOError:
620        print 'no metadata file found - will try to read file anyway'
621        head = ['no metadata file found',]
622       
623    tag = File.read(2)
624    byteOrd = '<'
625    if tag == 'II' and int(st.unpack('<h',File.read(2))[0]) == 42:     #little endian
626        IFD = int(st.unpack(byteOrd+'i',File.read(4))[0])
627    elif tag == 'MM' and int(st.unpack('>h',File.read(2))[0]) == 42:   #big endian
628        byteOrd = '>'
629        IFD = int(st.unpack(byteOrd+'i',File.read(4))[0])       
630    else:
631        lines = ['not a detector tiff file',]
632        return lines,0,0,0
633    File.seek(IFD)                                                  #get number of directory entries
634    NED = int(st.unpack(byteOrd+'h',File.read(2))[0])
635    IFD = {}
636    for ied in range(NED):
637        Tag,Type = st.unpack(byteOrd+'Hh',File.read(4))
638        nVal = st.unpack(byteOrd+'i',File.read(4))[0]
639        if Type == 1:
640            Value = st.unpack(byteOrd+nVal*'b',File.read(nVal))
641        elif Type == 2:
642            Value = st.unpack(byteOrd+'i',File.read(4))
643        elif Type == 3:
644            Value = st.unpack(byteOrd+nVal*'i',File.read(nVal*4))
645        elif Type == 4:
646            Value = st.unpack(byteOrd+nVal*'i',File.read(nVal*4))
647        elif Type == 5:
648            Value = st.unpack(byteOrd+nVal*'i',File.read(nVal*4))
649        elif Type == 11:
650            Value = st.unpack(byteOrd+nVal*'f',File.read(nVal*4))
651        IFD[Tag] = [Type,nVal,Value]
652    sizexy = [IFD[256][2][0],IFD[257][2][0]]
653    [nx,ny] = sizexy
654    Npix = nx*ny
655    if 272 in IFD:
656        ifd = IFD[272]
657        File.seek(ifd[2][0])
658        S = File.read(ifd[1])
659        if 'PILATUS' in S:
660            tifType = 'Pilatus'
661            dataType = 0
662            pixy = (172,172)
663            File.seek(4096)
664            if not imageOnly:
665                print 'Read Pilatus tiff file: ',filename
666            image = ar.array('L',File.read(4*Npix))
667            image = np.array(np.asarray(image),dtype=np.int32)
668    elif 262 in IFD and IFD[262][2][0] > 4:
669        tifType = 'DND'
670        pixy = (158,158)
671        File.seek(512)
672        if not imageOnly:
673            print 'Read DND SAX/WAX-detector tiff file: ',filename
674        image = np.array(ar.array('H',File.read(2*Npix)),dtype=np.int32)
675    elif sizexy == [1536,1536]:
676        tifType = 'APS Gold'
677        pixy = (150,150)
678        File.seek(64)
679        if not imageOnly:
680            print 'Read Gold tiff file:',filename
681        image = np.array(ar.array('H',File.read(2*Npix)),dtype=np.int32)
682    elif sizexy == [2048,2048] or sizexy == [1024,1024]:
683        if IFD[273][2][0] == 8:
684            if IFD[258][2][0] == 32:
685                tifType = 'PE'
686                pixy = (200,200)
687                File.seek(8)
688                if not imageOnly:
689                    print 'Read APS PE-detector tiff file: ',filename
690                if dataType == 5:
691                    image = np.array(ar.array('f',File.read(4*Npix)),dtype=np.int32)
692                else:
693                    image = np.array(ar.array('I',File.read(4*Npix)),dtype=np.int32)
694        elif IFD[273][2][0] == 4096:
695            tifType = 'MAR'
696            pixy = (158,158)
697            File.seek(4096)
698            if not imageOnly:
699                print 'Read MAR CCD tiff file: ',filename
700            image = np.array(ar.array('H',File.read(2*Npix)),dtype=np.int32)
701           
702    else:
703        lines = ['not a known detector tiff file',]
704        return lines,0,0,0
705       
706    image = np.reshape(image,(sizexy[1],sizexy[0]))
707    center = [pixy[0]*sizexy[0]/2000,pixy[1]*sizexy[1]/2000]
708    data = {'pixelSize':pixy,'wavelength':0.10,'distance':100.0,'center':center,'size':sizexy}
709    File.close()   
710    if imageOnly:
711        return image
712    else:
713        return head,data,Npix,image
714   
715def ProjFileOpen(self):
716    file = open(self.GSASprojectfile,'rb')
717    print 'load from file: ',self.GSASprojectfile
718    wx.BeginBusyCursor()
719    try:
720        while True:
721            try:
722                data = cPickle.load(file)
723            except EOFError:
724                break
725            datum = data[0]
726            print 'load: ',datum[0]
727           
728            Id = self.PatternTree.AppendItem(parent=self.root,text=datum[0])
729            if 'PWDR' in datum[0]:               
730                self.PatternTree.SetItemPyData(Id,datum[1][:3])     #temp. trim off junk
731            else:
732                self.PatternTree.SetItemPyData(Id,datum[1])
733            for datus in data[1:]:
734                print '    load: ',datus[0]
735                               
736                sub = self.PatternTree.AppendItem(Id,datus[0])
737                self.PatternTree.SetItemPyData(sub,datus[1])
738                                               
739            if 'IMG' in datum[0]:                   #retreive image default flag & data if set
740                Data = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,Id,'Image Controls'))
741                if Data['setDefault']:
742                    self.imageDefault = Data               
743        file.close()
744       
745    finally:
746        wx.EndBusyCursor()
747    print 'project load successful'
748    self.NewPlot = True
749   
750def ProjFileSave(self):
751    if not self.PatternTree.IsEmpty():
752        file = open(self.GSASprojectfile,'wb')
753        print 'save to file: ',self.GSASprojectfile
754        wx.BeginBusyCursor()
755        try:
756            item, cookie = self.PatternTree.GetFirstChild(self.root)
757            while item:
758                data = []
759                name = self.PatternTree.GetItemText(item)
760                print 'save: ',name
761                data.append([name,self.PatternTree.GetItemPyData(item)])
762                item2, cookie2 = self.PatternTree.GetFirstChild(item)
763                while item2:
764                    name = self.PatternTree.GetItemText(item2)
765                    print '    save: ',name
766                    data.append([name,self.PatternTree.GetItemPyData(item2)])
767                    item2, cookie2 = self.PatternTree.GetNextChild(item, cookie2)                           
768                item, cookie = self.PatternTree.GetNextChild(self.root, cookie)                           
769                cPickle.dump(data,file,1)
770            file.close()
771        finally:
772            wx.EndBusyCursor()
773        print 'project save successful'
774       
775def SaveIntegration(self,PickId,data):
776    azms = self.Integrate[1]
777    X = self.Integrate[2][:-1]
778    Xminmax = [X[0],X[-1]]
779    N = len(X)
780    Id = self.PatternTree.GetItemParent(PickId)
781    name = self.PatternTree.GetItemText(Id)
782    name = name.replace('IMG ','PWDR ')
783    Comments = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,Id, 'Comments'))
784    names = ['Type','Lam','Zero','Polariz.','U','V','W','X','Y','SH/L','Azimuth'] 
785    codes = [0 for i in range(11)]
786    parms = ['PXC',data['wavelength'],0.0,0.0,1.0,-1.0,0.3,0.0,1.0,0.0,0.0]
787    Azms = [(azms[i+1]+azms[i])/2. for i in range(len(azms)-1)]
788    for i,azm in enumerate(Azms):
789        item, cookie = self.PatternTree.GetFirstChild(self.root)
790        Id = 0
791        while item:
792            Name = self.PatternTree.GetItemText(item)
793            if name == Name:
794                Id = item
795            item, cookie = self.PatternTree.GetNextChild(self.root, cookie)
796        parms[10] = azm
797        Y = self.Integrate[0][i]
798        W = np.sqrt(Y)
799        Sample = {'Scale':[1.0,True],'Type':'Debye-Scherrer','Absorption':[0.0,False],'DisplaceX':[0.0,False],
800            'DisplaceY':[0.0,False],'Diffuse':[],'Temperature':300.,'Pressure':1.0,'Humidity':0.0,'Voltage':0.0,'Force':0.0}
801        if Id:
802            self.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(self,Id, 'Comments'),Comments)                   
803            self.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(self,Id,'Limits'),[tuple(Xminmax),Xminmax])
804            self.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(self,Id,'Background'),[['chebyschev',1,3,1.0,0.0,0.0]])
805            self.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(self,Id,'Instrument Parameters'),[tuple(parms),parms,codes,names])
806            self.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(self,Id,'Peak List'),[])
807            self.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(self,Id,'Index Peak List'),[])
808            self.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(self,Id,'Unit Cells List'),[])             
809        else:
810            Id = self.PatternTree.AppendItem(parent=self.root,text=name+" Azm= %.2f"%(azm))
811            self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='Comments'),Comments)                   
812            self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='Limits'),[tuple(Xminmax),Xminmax])
813            self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='Background'),[['chebyschev',1,3,1.0,0.0,0.0]])
814            self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='Instrument Parameters'),[tuple(parms),parms,codes,names])
815            self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='Sample Parameters'),Sample)
816            self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='Peak List'),[])
817            self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='Index Peak List'),[])
818            self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='Unit Cells List'),[])             
819        self.PatternTree.SetItemPyData(Id,[[''],[np.array(X),np.array(Y),np.array(W),np.zeros(N),np.zeros(N),np.zeros(N)]])
820    self.PatternTree.SelectItem(Id)
821    self.PatternTree.Expand(Id)
822    self.PatternId = Id
823           
824def powderFxyeSave(self,powderfile):
825    file = open(powderfile,'w')
826    prm = open(powderfile.strip('fxye')+'prm','w')      #old style GSAS parm file
827    print 'save powder pattern to file: ',powderfile
828    wx.BeginBusyCursor()
829    Inst = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self, \
830                    self.PickId, 'Instrument Parameters'))[1]
831    if len(Inst) == 11:             #single wavelength
832        lam1 = Inst[1]
833        lam2 = 0.0
834        GU,GV,GW = Inst[4:7]
835        LX,LY = Inst[7:9]
836        SL = HL = Inst[9]/2.0   
837    else:                           #Ka1 & Ka2
838        lam1 = Inst[1]
839        lam2 = Inst[2]
840        GU,GV,GW = Inst[6:9]
841        LX,LY = Inst[9:11]
842        SL = HL = Inst[11]/2.0   
843    prm.write( '            123456789012345678901234567890123456789012345678901234567890        '+'\n')
844    prm.write( 'INS   BANK      1                                                               '+'\n')
845    prm.write( 'INS   HTYPE   PXCR                                                              '+'\n')
846    prm.write(('INS  1 ICONS%10.7f%10.7f    0.0000               0.990    0     0.500   '+'\n')%(lam1,lam2))
847    prm.write( 'INS  1 IRAD     0                                                               '+'\n')
848    prm.write( 'INS  1I HEAD                                                                    '+'\n')
849    prm.write( 'INS  1I ITYP    0    0.0000  180.0000         1                                 '+'\n')
850    prm.write( 'INS  1PRCF1     3    8   0.00100                                                '+'\n')
851    prm.write(('INS  1PRCF11     %15.6g%15.6g%15.6g%15.6g   '+'\n')%(GU,GV,GW,0.0))
852    prm.write(('INS  1PRCF12     %15.6g%15.6g%15.6g%15.6g   '+'\n')%(LX,LY,SL,HL))
853    prm.close()
854    try:
855        x,y,w,yc,yb,yd = self.PatternTree.GetItemPyData(self.PickId)[1]
856        file.write(powderfile+'\n')
857        file.write('BANK 1 %d %d CONS %.2f %.2f 0 0 FXYE\n'%(len(x),len(x),\
858            100.*x[0],100.*(x[1]-x[0])))
859        s = list(np.sqrt(1./np.array(w)))       
860        XYW = zip(x,y,s)
861        for X,Y,S in XYW:
862            file.write("%15.6g %15.6g %15.6g\n" % (100.*X,Y,S))
863        file.close()
864    finally:
865        wx.EndBusyCursor()
866    print 'powder pattern file written'
867       
868def powderXyeSave(self,powderfile):
869    file = open(powderfile,'w')
870    print 'save powder pattern to file: ',powderfile
871    wx.BeginBusyCursor()
872    try:
873        x,y,w,yc,yb,yd = self.PatternTree.GetItemPyData(self.PickId)[1]
874        XYW = zip(x,y,w)
875        for X,Y,W in XYW:
876            file.write("%15.6g %15.6g %15.6g\n" % (X,Y,W))
877        file.close()
878    finally:
879        wx.EndBusyCursor()
880    print 'powder pattern file written'
881   
882def PeakListSave(self,file,peaks):
883    print 'save peak list to file: ',self.peaklistfile
884    if not peaks:
885        dlg = wx.MessageDialog(self, 'No peaks!', 'Nothing to save!', wx.OK)
886        try:
887            result = dlg.ShowModal()
888        finally:
889            dlg.Destroy()
890        return
891    for peak in peaks:
892        file.write("%10.4f %12.2f %10.3f %10.3f \n" % \
893            (peak[0],peak[2],peak[4],peak[6]))
894    print 'peak list saved'
895             
896def IndexPeakListSave(self,peaks):
897    file = open(self.peaklistfile,'wa')
898    print 'save index peak list to file: ',self.peaklistfile
899    wx.BeginBusyCursor()
900    try:
901        if not peaks:
902            dlg = wx.MessageDialog(self, 'No peaks!', 'Nothing to save!', wx.OK)
903            try:
904                result = dlg.ShowModal()
905            finally:
906                dlg.Destroy()
907            return
908        for peak in peaks:
909            file.write("%12.6f\n" % (peak[7]))
910        file.close()
911    finally:
912        wx.EndBusyCursor()
913    print 'index peak list saved'
914   
915def ReadEXPPhase(self,filename):
916    file = open(filename, 'Ur')
917    Phase = {}
918    S = 1
919    Expr = [{},{},{},{},{},{},{},{},{}]
920    while S:
921        S = file.readline()
922        if 'EXPR NPHAS' in S[:12]:
923            Num = S[12:-1].count('0')
924            NPhas = S[12:-1].split()
925        if 'CRS' in S[:3]:
926            N = int(S[3:4])-1
927            Expr[N][S[:12]] = S[12:-1]
928    file.close()
929    PNames = []
930    for n,N in enumerate(NPhas):
931        if N != '0':
932            result = n
933            key = 'CRS'+str(n+1)+'    PNAM'
934            PNames.append(Expr[n][key])
935    if Num < 8:
936        dlg = wx.SingleChoiceDialog(self, 'Which phase to read?', 'Read phase data', PNames, wx.CHOICEDLG_STYLE)
937        try:
938            if dlg.ShowModal() == wx.ID_OK:
939                result = dlg.GetSelection()
940        finally:
941            dlg.Destroy()       
942    EXPphase = Expr[result]
943    keyList = EXPphase.keys()
944    keyList.sort()
945    SGData = {}
946    if NPhas[result] == '1':
947        Ptype = 'nuclear'
948    elif NPhas[result] in ['2','3']:
949        Ptype = 'magnetic'
950    elif NPhas[result] == '4':
951        Ptype = 'macromolecular'
952    elif NPhas[result] == '10':
953        Ptype = 'Pawley'
954    for key in keyList:
955        if 'PNAM' in key:
956           PhaseName = EXPphase[key].strip()
957        elif 'ABC   ' in key:
958            abc = [float(EXPphase[key][:10]),float(EXPphase[key][10:20]),float(EXPphase[key][20:30])]                       
959        elif 'ANGLES' in key:
960            angles = [float(EXPphase[key][:10]),float(EXPphase[key][10:20]),float(EXPphase[key][20:30])]                                               
961        elif 'SG SYM' in key:
962            SpGrp = EXPphase[key][:15].strip()
963            E,SGData = G2spc.SpcGroup(SpGrp)
964    Atoms = []
965    if Ptype == 'nuclear':
966        for key in keyList:
967            if 'AT' in key:
968                if key[11:] == 'A':
969                    S = EXPphase[key]
970                elif key[11:] == 'B':
971                    S += EXPphase[key]
972                    Atom = [S[50:58].strip(),S[:10].strip(),'',
973                        float(S[10:20]),float(S[20:30]),float(S[30:40]),
974                        float(S[40:50]),'',int(S[60:62]),S[130:131]]
975                    if Atom[9] == 'I':
976                        Atom += [float(S[68:78]),0.,0.,0.,0.,0.,0.]
977                    elif Atom[9] == 'A':
978                        Atom += [0.0,float(S[68:78]),float(S[78:88]),
979                            float(S[88:98]),float(S[98:108]),
980                            float(S[108:118]),float(S[118:128])]
981                    XYZ = Atom[3:6]
982                    Atom[7],Atom[8] = G2spc.SytSym(XYZ,SGData)
983                    Atom.append(ran.randint(0,sys.maxint))
984                    Atoms.append(Atom)
985    elif Ptype == 'macromolecular':
986        for key in keyList:
987            if 'AT' in key[6:8]:
988                S = EXPphase[key]
989                Atom = [int(S[56:60]),S[50:54].strip().upper(),S[54:56],
990                    S[46:51].strip(),S[:8].strip(),'',
991                    float(S[16:24]),float(S[24:32]),float(S[32:40]),
992                    float(S[8:16]),'1',1,'I',float(S[40:46]),0,0,0,0,0,0]
993                XYZ = Atom[6:9]
994                Atom[10],Atom[11] = G2spc.SytSym(XYZ,SGData)
995                Atom.append(ran.randint(0,sys.maxint))
996                Atoms.append(Atom)
997    Volume = G2lat.calc_V(G2lat.cell2A(abc+angles))
998    Phase['General'] = {'Name':PhaseName,'Type':Ptype,'SGData':SGData,
999        'Cell':[False,]+abc+angles+[Volume,]}
1000    Phase['Atoms'] = Atoms
1001    Phase['Drawing'] = {}
1002    Phase['Histograms'] = {}
1003    return Phase
1004       
1005def ReadPDBPhase(filename):
1006    EightPiSq = 8.*math.pi**2
1007    file = open(filename, 'Ur')
1008    Phase = {}
1009    Title = ''
1010    Compnd = ''
1011    Atoms = []
1012    A = np.zeros(shape=(3,3))
1013    S = file.readline()
1014    while S:
1015        Atom = []
1016        if 'TITLE' in S[:5]:
1017            Title = S[10:72].strip()
1018            S = file.readline()
1019        elif 'COMPND    ' in S[:10]:
1020            Compnd = S[10:72].strip()
1021            S = file.readline()
1022        elif 'CRYST' in S[:5]:
1023            abc = S[7:34].split()
1024            angles = S[34:55].split()
1025            cell=[float(abc[0]),float(abc[1]),float(abc[2]),
1026                float(angles[0]),float(angles[1]),float(angles[2])]
1027            Volume = G2lat.calc_V(G2lat.cell2A(cell))
1028            AA,AB = G2lat.cell2AB(cell)
1029            SpGrp = S[55:65]
1030            E,SGData = G2spc.SpcGroup(SpGrp)
1031            if E: 
1032                print ' ERROR in space group symbol ',SpGrp,' in file ',filename
1033                print ' N.B.: make sure spaces separate axial fields in symbol' 
1034                print G2spc.SGErrors(E)
1035                return None
1036            SGlines = G2spc.SGPrint(SGData)
1037            for line in SGlines: print line
1038            S = file.readline()
1039        elif 'SCALE' in S[:5]:
1040            V = (S[10:41].split())
1041            A[int(S[5])-1] = [float(V[0]),float(V[1]),float(V[2])]
1042            S = file.readline()
1043        elif 'ATOM' in S[:4] or 'HETATM' in S[:6]:
1044            XYZ = [float(S[31:39]),float(S[39:47]),float(S[47:55])]
1045            XYZ = np.inner(AB,XYZ)
1046            SytSym,Mult = G2spc.SytSym(XYZ,SGData)
1047            Uiso = float(S[61:67])/EightPiSq
1048            Type = S[12:14].upper()
1049            if Type[0] in '123456789':
1050                Type = Type[1:]
1051            Atom = [S[22:27].strip(),S[17:20].upper(),S[20:22],
1052                S[12:17].strip(),Type.strip(),'',XYZ[0],XYZ[1],XYZ[2],
1053                float(S[55:61]),SytSym,Mult,'I',Uiso,0,0,0,0,0,0]
1054            S = file.readline()
1055            if 'ANISOU' in S[:6]:
1056                Uij = S[30:72].split()
1057                Uij = [float(Uij[0])/10000.,float(Uij[1])/10000.,float(Uij[2])/10000.,
1058                    float(Uij[3])/10000.,float(Uij[4])/10000.,float(Uij[5])/10000.]
1059                Atom = Atom[:14]+Uij
1060                Atom[12] = 'A'
1061                S = file.readline()
1062            Atom.append(ran.randint(0,sys.maxint))
1063            Atoms.append(Atom)
1064        else:           
1065            S = file.readline()
1066    file.close()
1067    if Title:
1068        PhaseName = Title
1069    elif Compnd:
1070        PhaseName = Compnd
1071    else:
1072        PhaseName = 'None'
1073    Phase['General'] = {'Name':PhaseName,'Type':'macromolecular','SGData':SGData,
1074        'Cell':[False,]+cell+[Volume,]}
1075    Phase['Atoms'] = Atoms
1076    Phase['Drawing'] = {}
1077    Phase['Histograms'] = {}
1078   
1079    return Phase
1080   
1081def ReadCIFPhase(filename):
1082    anisoNames = ['aniso_u_11','aniso_u_22','aniso_u_33','aniso_u_12','aniso_u_13','aniso_u_23']
1083    file = open(filename, 'Ur')
1084    Phase = {}
1085    Title = ospath.split(filename)[-1]
1086    print '\n Reading cif file: ',Title
1087    Compnd = ''
1088    Atoms = []
1089    A = np.zeros(shape=(3,3))
1090    S = file.readline()
1091    while S:
1092        if '_symmetry_space_group_name_H-M' in S:
1093            SpGrp = S.split("_symmetry_space_group_name_H-M")[1].strip().strip('"').strip("'")
1094            E,SGData = G2spc.SpcGroup(SpGrp)
1095            if E:
1096                print ' ERROR in space group symbol ',SpGrp,' in file ',filename
1097                print ' N.B.: make sure spaces separate axial fields in symbol' 
1098                print G2spc.SGErrors(E)
1099                return None
1100            S = file.readline()
1101        elif '_cell' in S:
1102            if '_cell_length_a' in S:
1103                a = S.split('_cell_length_a')[1].strip().strip('"').strip("'").split('(')[0]
1104            elif '_cell_length_b' in S:
1105                b = S.split('_cell_length_b')[1].strip().strip('"').strip("'").split('(')[0]
1106            elif '_cell_length_c' in S:
1107                c = S.split('_cell_length_c')[1].strip().strip('"').strip("'").split('(')[0]
1108            elif '_cell_angle_alpha' in S:
1109                alp = S.split('_cell_angle_alpha')[1].strip().strip('"').strip("'").split('(')[0]
1110            elif '_cell_angle_beta' in S:
1111                bet = S.split('_cell_angle_beta')[1].strip().strip('"').strip("'").split('(')[0]
1112            elif '_cell_angle_gamma' in S:
1113                gam = S.split('_cell_angle_gamma')[1].strip().strip('"').strip("'").split('(')[0]
1114            S = file.readline()
1115        elif 'loop_' in S:
1116            labels = {}
1117            i = 0
1118            while S:
1119                S = file.readline()
1120                if '_atom_site' in S.strip()[:10]:
1121                    labels[S.strip().split('_atom_site_')[1].lower()] = i
1122                    i += 1
1123                else:
1124                    break
1125            if labels:
1126                if 'aniso_label' not in labels:
1127                    while S:
1128                        atom = ['','','',0,0,0,0,'','','I',0.01,0,0,0,0,0,0]
1129                        S.strip()
1130                        if len(S.split()) != len(labels):
1131                            if 'loop_' in S:
1132                                break
1133                            S += file.readline().strip()
1134                        data = S.split()
1135                        if len(data) != len(labels):
1136                            break
1137                        for key in labels:
1138                            if key == 'type_symbol':
1139                                atom[1] = data[labels[key]]
1140                            elif key == 'label':
1141                                atom[0] = data[labels[key]]
1142                            elif key == 'fract_x':
1143                                atom[3] = float(data[labels[key]].split('(')[0])
1144                            elif key == 'fract_y':
1145                                atom[4] = float(data[labels[key]].split('(')[0])
1146                            elif key == 'fract_z':
1147                                atom[5] = float(data[labels[key]].split('(')[0])
1148                            elif key == 'occupancy':
1149                                atom[6] = float(data[labels[key]].split('(')[0])
1150                            elif key == 'thermal_displace_type':
1151                                if data[labels[key]].lower() == 'uiso':
1152                                    atom[9] = 'I'
1153                                    atom[10] = float(data[labels['u_iso_or_equiv']].split('(')[0])
1154                                else:
1155                                    atom[9] = 'A'
1156                                    atom[10] = 0.0
1157                                   
1158                        atom[7],atom[8] = G2spc.SytSym(atom[3:6],SGData)
1159                        atom.append(ran.randint(0,sys.maxint))
1160                        Atoms.append(atom)
1161                        S = file.readline()
1162                else:
1163                    while S:
1164                        S.strip()
1165                        data = S.split()
1166                        if len(data) != len(labels):
1167                            break
1168                        name = data[labels['aniso_label']]
1169                        for atom in Atoms:
1170                            if name == atom[0]:
1171                                for i,uname in enumerate(anisoNames):
1172                                    atom[i+11] = float(data[labels[uname]].split('(')[0])
1173                        S = file.readline()
1174                                                                       
1175        else:           
1176            S = file.readline()
1177    file.close()
1178    if Title:
1179        PhaseName = Title
1180    else:
1181        PhaseName = 'None'
1182    SGlines = G2spc.SGPrint(SGData)
1183    for line in SGlines: print line
1184    cell = [float(a),float(b),float(c),float(alp),float(bet),float(gam)]
1185    Volume = G2lat.calc_V(G2lat.cell2A(cell))
1186    Phase['General'] = {'Name':PhaseName,'Type':'nuclear','SGData':SGData,
1187        'Cell':[False,]+cell+[Volume,]}
1188    Phase['Atoms'] = Atoms
1189    Phase['Drawing'] = {}
1190    Phase['Histograms'] = {}
1191   
1192    return Phase
Note: See TracBrowser for help on using the repository browser.