source: trunk/imports/G2sfact.py @ 1832

Last change on this file since 1832 was 1832, checked in by toby, 7 years ago

bug fix in unused grid code; doc fixes and cleanup

  • Property svn:eol-style set to native
  • Property svn:keywords set to Date Author Revision URL Id
File size: 22.4 KB
Line 
1# -*- coding: utf-8 -*-
2########### SVN repository information ###################
3# $Date: 2015-05-02 22:30:05 +0000 (Sat, 02 May 2015) $
4# $Author: toby $
5# $Revision: 1832 $
6# $URL: trunk/imports/G2sfact.py $
7# $Id: G2sfact.py 1832 2015-05-02 22:30:05Z toby $
8########### SVN repository information ###################
9'''
10*Module G2sfact: simple HKL import*
11-----------------------------------
12Read structure factors from a simple hkl file. Two routines are
13provided to read from files containing F or F\ :sup:`2` values.
14
15'''
16import sys
17import numpy as np
18import copy
19import GSASIIIO as G2IO
20import GSASIIpath
21GSASIIpath.SetVersionNumber("$Revision: 1832 $")
22
23def ColumnValidator(parent, filepointer,nCol=5):
24    'Validate a file to check that it contains columns of numbers'
25    l = filepointer.readline()
26    line = 1
27    while l[0] in ['#','(']:        #get past comments & fortran formats, if any
28        l = filepointer.readline()       
29        line += 1
30    for i in range(10): # scan a few lines
31        S = l.split()
32        if len(S) < nCol:
33            parent.errors = 'line '+str(line)+': invalid input\n'+l
34            return False
35        for v in S[:nCol]:
36            try:
37                float(v)
38            except ValueError:
39                parent.errors = 'line '+str(line)+': string found where a number is expected\n'+l
40                return False           
41        l = filepointer.readline()
42        line += 1
43    return True
44
45
46class HKLF_ReaderClass(G2IO.ImportStructFactor):
47    'Routines to import F, sig(F) reflections from a HKLF file'
48    def __init__(self):
49        super(self.__class__,self).__init__( # fancy way to self-reference
50            extensionlist=('.hkl','.HKL'),
51            strictExtension=False,
52            formatName = 'HKL F',
53            longFormatName = 'Simple [hkl, Fo, sig(Fo)] Structure factor text file'
54            )
55
56    def ContentsValidator(self, filepointer):
57        'Make sure file contains the expected columns on numbers'
58        return ColumnValidator(self, filepointer)
59
60    def Reader(self,filename,filepointer, ParentFrame=None, **unused):
61        'Read the file'
62        try:
63            for line,S in enumerate(filepointer):
64                self.errors = '  Error reading line '+str(line+1)
65                if S[0] == '#': continue       #ignore comments, if any
66                h,k,l,Fo,sigFo = S.split()
67                h,k,l = [int(h),int(k),int(l)]
68                if not any([h,k,l]):
69                    break
70                Fo = float(Fo)
71                sigFo = float(sigFo)
72                # h,k,l,m,dsp,Fo2,sig,Fc2,Fot2,Fct2,phase,...
73                self.RefDict['RefList'].append([h,k,l,0,0,Fo**2,2.*Fo*sigFo,0,Fo**2,0,0,0])
74            self.errors = 'Error after reading reflections (unexpected!)'
75            self.RefDict['RefList'] = np.array(self.RefDict['RefList'])
76            self.RefDict['Type'] = 'SXC'
77            self.RefDict['Super'] = 0
78            self.UpdateParameters(Type='SXC',Wave=None) # histogram type
79            return True
80        except Exception as detail:
81            self.errors += '\n  '+str(detail)
82            print '\n\n'+self.formatName+' read error: '+str(detail) # for testing
83            import traceback
84            traceback.print_exc(file=sys.stdout)
85            return False
86
87class HKLF2_ReaderClass(G2IO.ImportStructFactor):
88    'Routines to import F**2, sig(F**2) reflections from a HKLF file'
89    def __init__(self):
90        if 'linux' in sys.platform:  # wx 3.0.0.0 on gtk does not like Unicode in menus
91            formatName = 'HKL F2'
92            longFormatName = 'Simple [hkl, Fo2, sig(Fo2)] Structure factor text file'
93        else:
94            formatName = u'HKL F\u00b2'
95            longFormatName = u'Simple [hkl, Fo\u00b2, sig(Fo\u00b2)] Structure factor text file'
96        super(self.__class__,self).__init__( # fancy way to self-reference
97            extensionlist=('.hkl','.HKL'),
98            strictExtension=False,
99            formatName=formatName,
100            longFormatName=longFormatName)
101
102    def ContentsValidator(self, filepointer):
103        'Make sure file contains the expected columns on numbers'
104        return ColumnValidator(self, filepointer)
105
106    def Reader(self,filename,filepointer, ParentFrame=None, **unused):
107        'Read the file'
108        try:
109            for line,S in enumerate(filepointer):
110                self.errors = '  Error reading line '+str(line+1)
111                if S[0] == '#': continue       #ignore comments, if any
112                h,k,l,Fo,sigFo = S.split()
113                h,k,l = [int(h),int(k),int(l)]
114                if not any([h,k,l]):
115                    break
116                Fo = float(Fo)
117                sigFo = float(sigFo)
118                # h,k,l,m,dsp,Fo2,sig,Fc2,Fot2,Fct2,phase,...
119                self.RefDict['RefList'].append([h,k,l,0,0,Fo,sigFo,0,Fo,0,0,0])
120                #self.RefDict['FF'].append({}) # now done in OnImportSfact
121            self.errors = 'Error after reading reflections (unexpected!)'
122            self.RefDict['RefList'] = np.array(self.RefDict['RefList'])
123            self.RefDict['Type'] = 'SXC'
124            self.RefDict['Super'] = 0
125            self.UpdateParameters(Type='SXC',Wave=None) # histogram type
126            return True
127        except Exception as detail:
128            self.errors += '\n  '+str(detail)
129            print '\n\n'+self.formatName+' read error: '+str(detail) # for testing
130            import traceback
131            traceback.print_exc(file=sys.stdout)
132            return False
133           
134class M90_ReaderClass(G2IO.ImportStructFactor):
135    'Routines to import F**2, sig(F**2) reflections from a JANA M90 file'
136    def __init__(self):
137        if 'linux' in sys.platform:  # wx 3.0.0.0 on gtk does not like Unicode in menus
138            longFormatName = 'JANA [hkl, Fo2, sig(Fo2)] Structure factor text file'
139        else:
140            longFormatName = u'JANA [hkl, Fo\u00b2, sig(Fo\u00b2)] Structure factor text file'
141        super(self.__class__,self).__init__( # fancy way to self-reference
142            extensionlist=('.m90','.M90'),
143            strictExtension=False,
144            formatName = u'JANA M90',
145            longFormatName = longFormatName
146            )
147        self.Super = 0
148
149    def ContentsValidator(self, filepointer):
150        'Discover how many columns are in the m90 file - could be 9-12 depending on satellites'
151        numCols = 0
152        for i,line in enumerate(filepointer):
153            if 'Data' in line:
154                startData = i
155                break
156        for i,line in enumerate(filepointer):
157            if i > startData:
158                numCols = max(numCols,len(line.split()))
159            if i > startData+20:
160                break
161        self.Super = numCols-9     #= 0,1,2,or 3
162        if self.Super > 1:
163            raise self.ImportException("Supersymmetry too high; GSAS-II limited to (3+1) supersymmetry")           
164        return True #ColumnValidator(self, filepointer)
165
166    def Reader(self,filename,filepointer, ParentFrame=None, **unused):
167        'Read the file'
168        try:
169            for line,S in enumerate(filepointer):
170                self.errors = '  Error reading line '+str(line+1)
171                if S[0] == '#': continue       #ignore comments, if any
172                try:
173                    if self.Super == 0:
174                        h,k,l,Fo,sigFo = S.split()[:5]
175                        h,k,l = [int(h),int(k),int(l)]
176                    elif self.Super == 1:
177                        h,k,l,m1,Fo,sigFo = S.split()[:6]
178                        h,k,l,m1 = [int(h),int(k),int(l),int(m1)]
179                except ValueError:  #skipping text at front
180                    text = S.split()
181                    if text[0] == 'lambda':
182                        wave = float(text[1])
183                    continue
184                Fo = float(Fo)
185                sigFo = float(sigFo)
186                # h,k,l,m,dsp,Fo2,sig,Fc2,Fot2,Fct2,phase,...
187                if self.Super == 0:
188                    self.RefDict['RefList'].append([h,k,l,0,0,Fo,sigFo,0,Fo,0,0,0])
189                elif self.Super == 1:
190                    self.RefDict['RefList'].append([h,k,l,m1,0,0,Fo,sigFo,0,Fo,0,0,0])
191            self.errors = 'Error after reading reflections (unexpected!)'
192            self.RefDict['RefList'] = np.array(self.RefDict['RefList'])
193            self.RefDict['Type'] = 'SXC'
194            self.RefDict['Super'] = self.Super
195            self.UpdateParameters(Type='SXC',Wave=wave) # histogram type
196            return True
197        except Exception as detail:
198            self.errors += '\n  '+str(detail)
199            print '\n\n'+self.formatName+' read error: '+str(detail) # for testing
200            import traceback
201            traceback.print_exc(file=sys.stdout)
202            return False
203           
204class SHELX5_ReaderClass(G2IO.ImportStructFactor):
205    'Routines to import F**2, sig(F**2) reflections from a fixed format SHELX HKLF5 file'
206    def __init__(self):
207        if 'linux' in sys.platform:  # wx 3.0.0.0 on gtk does not like Unicode in menus
208            formatName = 'SHELX HKL F2'
209            longFormatName = 'SHELX HKLF5 [hkl, Fo2, sig(Fo2)] Structure factor text file'
210        else:
211            formatName = u'SHELX HKL F\u00b2'
212            longFormatName = u'SHELX HKLF5 [hkl, Fo\u00b2, sig(Fo\u00b2)] Structure factor text file'       
213        super(self.__class__,self).__init__( # fancy way to self-reference
214            extensionlist=('.hkl','.HKL'),
215            strictExtension=False,
216            formatName=formatName,
217            longFormatName=longFormatName)
218        self.Super = 0
219
220    def ContentsValidator(self, filepointer):
221        'Discover how many characters are in the SHELX file - could be 32-44 depending on satellites'
222        numCols = 0
223        for i,line in enumerate(filepointer):
224            numCols = max(numCols,len(line))
225            if i > 20:
226                break
227        self.Super = (numCols-33)/4     #= 0,1,2,or 3
228        print numCols,self.Super
229        return True #ColumnValidator(self, filepointer)
230
231    def Reader(self,filename,filepointer, ParentFrame=None, **unused):
232        'Read the file'
233        try:
234            for line,S in enumerate(filepointer):
235                self.errors = '  Error reading line '+str(line+1)
236                if self.Super == 0:
237                    h,k,l,Fo,sigFo = S[:4],S[4:8],S[8:12],S[12:20],S[20:28]
238                    h,k,l = [int(h),int(k),int(l)]
239                elif self.Super == 1:
240                    h,k,l,m1,Fo,sigFo = S[:4],S[4:8],S[8:12],S[12:16],S[16:24],S[24:32]
241                    h,k,l,m1 = [int(h),int(k),int(l),int(m1)]
242                elif self.Super == 2:
243                    h,k,l,m1,m2,Fo,sigFo = S[:4],S[4:8],S[8:12],S[12:16],S[16:20],S[20:28],S[28:36]
244                    h,k,l,m1,m2 = [int(h),int(k),int(l),int(m1),int(m2)]
245                elif self.Super == 3:
246                    h,k,l,m1,m2,m3,Fo,sigFo = S[:4],S[4:8],S[8:12],S[12:16],S[16:20],S[20:24],S[24:32],S[32:40]
247                    h,k,l,m1,m2,m3 = [int(h),int(k),int(l),int(m1),int(m2),int(m3)]
248                if not any([h,k,l]):
249                    break
250                Fo = float(Fo)
251                sigFo = float(sigFo)
252                # h,k,l,m,dsp,Fo2,sig,Fc2,Fot2,Fct2,phase,...
253                if self.Super == 0:
254                    self.RefDict['RefList'].append([h,k,l,0,0,Fo,sigFo,0,Fo,0,0,0])
255                elif self.Super == 1:
256                    self.RefDict['RefList'].append([h,k,l,m1,0,0,Fo,sigFo,0,Fo,0,0,0])
257                elif self.Super == 2:
258                    self.RefDict['RefList'].append([h,k,l,m1,m2,0,0,Fo,sigFo,0,Fo,0,0,0])
259                elif self.Super == 3:
260                    self.RefDict['RefList'].append([h,k,l,m1,m2,m3,0,0,Fo,sigFo,0,Fo,0,0,0])
261                #self.RefDict['FF'].append({}) # now done in OnImportSfact
262            self.errors = 'Error after reading reflections (unexpected!)'
263            self.RefDict['RefList'] = np.array(self.RefDict['RefList'])
264            self.RefDict['Type'] = 'SXC'
265            self.RefDict['Super'] = self.Super
266            self.UpdateParameters(Type='SXC',Wave=None) # histogram type
267            return True
268        except Exception as detail:
269            self.errors += '\n  '+str(detail)
270            print '\n\n'+self.formatName+' read error: '+str(detail) # for testing
271            import traceback
272            traceback.print_exc(file=sys.stdout)
273            return False
274
275class NT_HKLF2_ReaderClass(G2IO.ImportStructFactor):
276    'Routines to import neutron TOF F**2, sig(F**2) reflections from a HKLF file'
277    def __init__(self):
278        if 'linux' in sys.platform:  # wx 3.0.0.0 on gtk does not like Unicode in menus
279            formatName = 'Neutron TOF HKL F2'
280            longFormatName = 'Neutron TOF [hkl, Fo2, sig(Fo2),...] Structure factor text file'
281        else:
282            formatName = u'Neutron TOF HKL F\u00b2'
283            longFormatName = u'Neutron TOF [hkl, Fo\u00b2, sig(Fo\u00b2),...] Structure factor text file'
284        super(self.__class__,self).__init__( # fancy way to self-reference
285            extensionlist=('.hkl','.HKL'),
286            strictExtension=False,
287            formatName=formatName,
288            longFormatName=longFormatName)
289
290    def ContentsValidator(self, filepointer):
291        'Make sure file contains the expected columns on numbers & count number of data blocks - "Banks"'
292        oldNo = -1
293        for line,S in enumerate(filepointer):
294            if not S:   #empty line terminates read
295                break
296            if S[0] == '#': continue       #ignore comments, if any
297            if S.split()[:3] == ['0','0','0']:
298                break
299            bankNo = S.split()[5]
300            if bankNo != oldNo:
301                self.Banks.append({'RefDict':{'RefList':[],}})
302                oldNo = bankNo
303        filepointer.seek(0)
304        return ColumnValidator(self, filepointer,nCol=8)
305
306    def Reader(self,filename,filepointer, ParentFrame=None, **unused):
307        'Read the file'
308        filepointer.seek(0)
309        try:
310            for line,S in enumerate(filepointer):
311                self.errors = '  Error reading line '+str(line+1)
312                if S[0] == '#': continue       #ignore comments, if any
313                data = S.split()
314                h,k,l,Fo,sigFo,bN,wave,tbar = data[:8]  #bN = 1..., 6 dir cos next                   
315                h,k,l = [int(h),int(k),int(l)]
316                if not any([h,k,l]):
317                    break
318                Fo = float(Fo)
319                sigFo = float(sigFo)
320                wave = float(wave)
321                tbar = float(tbar)
322                if len(self.Banks):
323                    self.Banks[int(bN)-1]['RefDict']['RefList'].append([h,k,l,0,0,Fo,sigFo,0,Fo,0,0,0,wave,tbar])
324                else:
325                # h,k,l,m,dsp,Fo2,sig,Fc2,Fot2,Fct2,phase,...
326                    self.RefDict['RefList'].append([h,k,l,0,0,Fo,sigFo,0,Fo,0,0,0,wave,tbar])
327            if len(self.Banks):
328                self.UpdateParameters(Type='SNT',Wave=None) # histogram type
329                for Bank in self.Banks:
330                    Bank['RefDict']['RefList'] = np.array(Bank['RefDict']['RefList'])
331                    Bank['RefDict']['Type'] = 'SNT'                   
332                    Bank['RefDict']['Super'] = 0
333            else:
334                self.RefDict['RefList'] = np.array(self.RefDict['RefList'])
335                self.RefDict['Type'] = 'SNT'
336                self.RefDict['Super'] = 0
337                self.errors = 'Error after reading reflections (unexpected!)'
338                self.UpdateParameters(Type='SNT',Wave=None) # histogram type
339            return True
340        except Exception as detail:
341            self.errors += '\n  '+str(detail)
342            print '\n\n'+self.formatName+' read error: '+str(detail) # for testing
343            import traceback
344            traceback.print_exc(file=sys.stdout)
345            return False
346
347class NT_JANA2K_ReaderClass(G2IO.ImportStructFactor):
348    'Routines to import neutron TOF F**2, sig(F**2) reflections from a JANA2000 file'
349    def __init__(self):
350        if 'linux' in sys.platform:  # wx 3.0.0.0 on gtk does not like Unicode in menus
351            formatName = 'Neutron TOF JANA2000 F2'
352            longFormatName = 'Neutron TOF [hkl, Fo2, sig(Fo2),...] Structure factor text file'
353        else:
354            formatName = u'Neutron TOF JANA2000 F\u00b2'
355            longFormatName = u'Neutron TOF [hkl, Fo\u00b2, sig(Fo\u00b2),...] Structure factor text file'
356        super(self.__class__,self).__init__( # fancy way to self-reference
357            extensionlist=('.int','.INT'),
358            strictExtension=False,
359            formatName=formatName,
360            longFormatName=longFormatName)
361
362    def ContentsValidator(self, filepointer):
363        'Make sure file contains the expected columns on numbers & count number of data blocks - "Banks"'
364        oldNo = -1
365        for line,S in enumerate(filepointer):
366            if not S:   #empty line terminates read
367                break
368            if S[0] in ['#','(']: continue       #ignore comments & fortran format line
369            bankNo = S.split()[5]
370            if bankNo != oldNo:
371                self.Banks.append({'RefDict':{'RefList':[],}})
372                oldNo = bankNo
373        filepointer.seek(0)
374        return ColumnValidator(self, filepointer,nCol=10)
375
376    def Reader(self,filename,filepointer, ParentFrame=None, **unused):
377        'Read the file'
378        filepointer.seek(0)
379        try:
380            for line,S in enumerate(filepointer):
381                self.errors = '  Error reading line '+str(line+1)
382                if S[0] in ['#','(']: continue       #ignore comments & fortran format line
383                data = S.split()
384                h,k,l,Fo,sigFo,bN,wave,x,x,tbar = data[:10]  #bN = 1..., 6 dir cos next                   
385                h,k,l = [int(h),int(k),int(l)]
386                if not any([h,k,l]):
387                    break
388                Fo = float(Fo)
389                sigFo = float(sigFo)
390                wave = float(wave)
391                tbar = float(tbar)
392                if len(self.Banks):
393                    self.Banks[int(bN)-1]['RefDict']['RefList'].append([h,k,l,0,0,Fo,sigFo,0,Fo,0,0,0,wave,tbar])
394                else:
395                # h,k,l,m,dsp,Fo2,sig,Fc2,Fot2,Fct2,phase,...
396                    self.RefDict['RefList'].append([h,k,l,0,0,Fo,sigFo,0,Fo,0,0,0,wave,tbar])
397            if len(self.Banks):
398                self.UpdateParameters(Type='SNT',Wave=None) # histogram type
399                for Bank in self.Banks:
400                    Bank['RefDict']['RefList'] = np.array(Bank['RefDict']['RefList'])
401                    Bank['RefDict']['Type'] = 'SNT'                   
402                    Bank['RefDict']['Super'] = 0        #for now                   
403            else:
404                self.RefDict['RefList'] = np.array(self.RefDict['RefList'])
405                self.RefDict['Type'] = 'SNT'
406                self.RefDict['Super'] = 0   #for now
407                self.errors = 'Error after reading reflections (unexpected!)'
408                self.UpdateParameters(Type='SNT',Wave=None) # histogram type
409            return True
410        except Exception as detail:
411            self.errors += '\n  '+str(detail)
412            print '\n\n'+self.formatName+' read error: '+str(detail) # for testing
413            import traceback
414            traceback.print_exc(file=sys.stdout)
415            return False
416
417class ISIS_SXD_INT_ReaderClass(G2IO.ImportStructFactor):
418    'Routines to import neutron TOF F**2, sig(F**2) reflections from a ISIS int file'
419    def __init__(self):
420        if 'linux' in sys.platform:  # wx 3.0.0.0 on gtk does not like Unicode in menus
421            formatName = u'Neutron SXD TOF HKL F2'
422            longFormatName = u'Neutron SXD TOF [hkl, Fo2, sig(Fo2),...] Structure factor text file'
423        else:
424            formatName = u'Neutron SXD TOF HKL F\u00b2'
425            longFormatName = u'Neutron SXD TOF [hkl, Fo\u00b2, sig(Fo\u00b2),...] Structure factor text file'
426        super(self.__class__,self).__init__( # fancy way to self-reference
427            extensionlist=('.int','.INT'),
428            strictExtension=False,
429            formatName=formatName,
430            longFormatName=longFormatName)
431
432    def ContentsValidator(self, filepointer):
433        'Make sure file contains the expected columns on numbers & count number of data blocks - "Banks"'
434        oldNo = -1
435        for line,S in enumerate(filepointer):
436            if not S:   #empty line terminates read
437                break
438            if S[0] == '#': continue       #ignore comments, if any
439            if S[0] == '(': continue        #ignore format line
440            bankNo = S.split()[5]
441            if bankNo != oldNo:
442                self.Banks.append({'RefDict':{'RefList':[],}})
443                oldNo = bankNo
444        filepointer.seek(0)
445        return ColumnValidator(self, filepointer,nCol=8)
446
447    def Reader(self,filename,filepointer, ParentFrame=None, **unused):
448        'Read the file'
449        filepointer.seek(0)
450        try:
451            for line,S in enumerate(filepointer):
452                self.errors = '  Error reading line '+str(line+1)
453                if S[0] == '#': continue       #ignore comments, if any
454                if S[0] == '(': continue        #ignore the format line
455                data = S.split()
456                h,k,l,Fo,sigFo,bN,wave,x,x,tbar = data[:10]                   
457                h,k,l = [int(h),int(k),int(l)]
458                if not any([h,k,l]):
459                    break
460                Fo = float(Fo)
461                sigFo = float(sigFo)
462                wave = float(wave)
463                tbar = float(tbar)
464                if len(self.Banks):
465                    self.Banks[int(bN)-1]['RefDict']['RefList'].append([h,k,l,0,0,Fo,sigFo,0,Fo,0,0,0,wave,tbar])
466                else:
467                # h,k,l,m,dsp,Fo2,sig,Fc2,Fot2,Fct2,phase,...
468                    self.RefDict['RefList'].append([h,k,l,0,0,Fo,sigFo,0,Fo,0,0,0,wave,tbar])
469            if len(self.Banks):
470                self.UpdateParameters(Type='SNT',Wave=None) # histogram type
471                for Bank in self.Banks:
472                    Bank['RefDict']['RefList'] = np.array(Bank['RefDict']['RefList'])
473                    Bank['RefDict']['Type'] = 'SNT'                   
474                    Bank['RefDict']['Super'] = 0
475            else:
476                self.RefDict['RefList'] = np.array(self.RefDict['RefList'])
477                self.RefDict['Type'] = 'SNT'
478                self.RefDict['Super'] = 0
479                self.errors = 'Error after reading reflections (unexpected!)'
480                self.UpdateParameters(Type='SNT',Wave=None) # histogram type
481            return True
482        except Exception as detail:
483            self.errors += '\n  '+str(detail)
484            print '\n\n'+self.formatName+' read error: '+str(detail) # for testing
485            import traceback
486            traceback.print_exc(file=sys.stdout)
487            return False
488
Note: See TracBrowser for help on using the repository browser.