source: trunk/imports/G2sfact.py @ 4831

Last change on this file since 4831 was 4831, checked in by vondreele, 9 months ago

Fix SHELX hkl importer to deal with 3 digit hkls

  • Property svn:eol-style set to native
  • Property svn:keywords set to Date Author Revision URL Id
File size: 26.3 KB
Line 
1# -*- coding: utf-8 -*-
2########### SVN repository information ###################
3# $Date: 2021-02-27 17:59:43 +0000 (Sat, 27 Feb 2021) $
4# $Author: vondreele $
5# $Revision: 4831 $
6# $URL: trunk/imports/G2sfact.py $
7# $Id: G2sfact.py 4831 2021-02-27 17:59:43Z vondreele $
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'''
16from __future__ import division, print_function
17import sys
18import numpy as np
19import GSASIIobj as G2obj
20import GSASIIpath
21GSASIIpath.SetVersionNumber("$Revision: 4831 $")
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(G2obj.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, filename):
57        'Make sure file contains the expected columns on numbers'
58        fp = open(filename,'r')
59        valid = ColumnValidator(self, fp)
60        fp.close()
61        return valid
62
63    def Reader(self,filename, ParentFrame=None, **unused):
64        'Read the file'
65        fp = open(filename,'r')
66        for line,S in enumerate(fp):
67            self.errors = '  Error reading line '+str(line+1)
68            if S[0] == '#': continue       #ignore comments, if any
69            h,k,l,Fo,sigFo = S.split()
70            h,k,l = [int(h),int(k),int(l)]
71            if not any([h,k,l]):
72                break
73            Fo = float(Fo)
74            sigFo = float(sigFo)
75            # h,k,l,m,dsp,Fo2,sig,Fc2,Fot2,Fct2,phase,...
76            self.RefDict['RefList'].append([h,k,l,1,0,Fo**2,2.*Fo*sigFo,0,Fo**2,0,0,0])
77        fp.close()
78        self.errors = 'Error after reading reflections (unexpected!)'
79        self.RefDict['RefList'] = np.array(self.RefDict['RefList'])
80        self.RefDict['Type'] = 'SXC'
81        self.RefDict['Super'] = 0
82        self.UpdateParameters(Type='SXC',Wave=None) # histogram type
83        return True
84
85class HKLMF_ReaderClass(G2obj.ImportStructFactor):
86    'Routines to import F, reflections from a REMOS HKLMF file'
87    def __init__(self):
88        super(self.__class__,self).__init__( # fancy way to self-reference
89            extensionlist=('.fo','.FO'),
90            strictExtension=False,
91            formatName = 'HKLM F',
92            longFormatName = 'REMOS [hklm, Fo] Structure factor text file'
93            )
94
95    def ContentsValidator(self, filename):
96        'Make sure file contains the expected columns on numbers'
97        fp = open(filename,'r')
98        valid = ColumnValidator(self, fp)
99        fp.close()
100        return valid
101
102    def Reader(self,filename, ParentFrame=None, **unused):
103        'Read the file'
104        fp = open(filename,'r')
105        for line,S in enumerate(fp):
106            self.errors = '  Error reading line '+str(line+1)
107            if S[0] == '#': continue       #ignore comments, if any
108            h,k,l,m,Fo= S.split()
109            h,k,l,m = [int(h),int(k),int(l),int(m)]
110            if h == 999 or not any([h,k,l]):
111                break
112            Fo = float(Fo)
113            sigFo2 = Fo
114            if Fo < 1.0:
115                sigFo2 = 1.0
116           # h,k,l,m,tw,dsp,Fo2,sig,Fc2,Fot2,Fct2,phase,...
117            self.RefDict['RefList'].append([h,k,l,m,1,0,Fo**2,sigFo2,0,Fo**2,0,0,0])
118        fp.close()
119        self.errors = 'Error after reading reflections (unexpected!)'
120        self.RefDict['RefList'] = np.array(self.RefDict['RefList'])
121        self.RefDict['Type'] = 'SXC'
122        self.RefDict['Super'] = 1
123        self.UpdateParameters(Type='SXC',Wave=None) # histogram type
124        return True
125
126class SHELX4_ReaderClass(G2obj.ImportStructFactor):
127    'Routines to import F**2, sig(F**2) reflections from a Shelx HKLF 4 file'
128    def __init__(self):
129        if 'linux' in sys.platform:  # wx 3.0.0.0 on gtk does not like Unicode in menus
130            formatName = 'HKLF 4'
131            longFormatName = 'Shelx HKLF 4 [hkl, Fo2, sig(Fo2)] Structure factor text file'
132        else:
133            formatName = u'Shelx HKLF 4 F\u00b2'
134            longFormatName = u'Shelx HKLF 4 [hkl, Fo\u00b2, sig(Fo\u00b2)] Structure factor text file'
135        super(self.__class__,self).__init__( # fancy way to self-reference
136            extensionlist=('.hkl','.HKL'),
137            strictExtension=False,
138            formatName=formatName,
139            longFormatName=longFormatName)
140
141    def ContentsValidator(self, filename):
142        'Make sure file contains the expected columns on numbers'
143        return True
144#        return ColumnValidator(self, filepointer)
145
146    def Reader(self,filename, ParentFrame=None, **unused):
147        'Read the file'
148        fp = open(filename,'r')
149        for line,S in enumerate(fp):
150            self.errors = '  Error reading line '+str(line+1)
151            if S[0] == '#': continue       #ignore comments, if any
152            h,k,l = S[:4],S[4:8],S[8:12]
153#            h,k,l = S[:12].split()
154            Fo,sigFo = S[12:].split()[:2]
155#                h,k,l,Fo,sigFo = S[:4],S[4:8],S[8:12],S[12:20],S[20:28]
156            h,k,l = [int(h),int(k),int(l)]
157            if not any([h,k,l]):
158                break
159            Fo = float(Fo)
160            sigFo = float(sigFo)
161            # h,k,l,m,dsp,Fo2,sig,Fc2,Fot2,Fct2,phase,...
162            self.RefDict['RefList'].append([h,k,l,1,0,Fo,sigFo,0,Fo,0,0,0])
163            #self.RefDict['FF'].append({}) # now done in OnImportSfact
164        fp.close()
165        self.errors = 'Error after reading reflections (unexpected!)'
166        self.RefDict['RefList'] = np.array(self.RefDict['RefList'])
167        self.RefDict['Type'] = 'SXC'
168        self.RefDict['Super'] = 0
169        self.UpdateParameters(Type='SXC',Wave=None) # histogram type
170        return True
171           
172class SHELX5_ReaderClass(G2obj.ImportStructFactor):
173    'Routines to import F**2, sig(F**2) twin/incommensurate reflections from a fixed format SHELX HKLF5 file'
174    def __init__(self):
175        if 'linux' in sys.platform:  # wx 3.0.0.0 on gtk does not like Unicode in menus
176            formatName = 'Shelx HKLF 5 F2 Tw/Incom'
177            longFormatName = 'Shelx HKLF 5 [hklm, Fo2, sig(Fo2), Tind] Twin/incommensurate structure factor text file'
178        else:
179            formatName = u'Shelx HKLF 5 F\u00b2 Tw/Incom'
180            longFormatName = u'Shelx HKLF 5 [hklm, Fo\u00b2, sig(Fo\u00b2), Tind] Twin/incommensurate structure factor text file'       
181        super(self.__class__,self).__init__( # fancy way to self-reference
182            extensionlist=('.hkl','.HKL'),
183            strictExtension=False,
184            formatName=formatName,
185            longFormatName=longFormatName)
186        self.Super = 0
187
188    def ContentsValidator(self, filename):
189        '''Discover how many columns before F^2 are in the SHELX HKL5 file
190        - could be 3-6 depending on satellites'''
191        numCols = 0
192        fp = open(filename,'r')
193        for i,line in enumerate(fp):
194            for j,item in enumerate(line.split()):  #find 1st col with '.'; has F^2
195                if '.' in item:
196                    numCols = max(numCols,j)
197                    break
198            if i > 20:
199                break
200        fp.close()
201        self.Super = numCols-3     #= 0,1,2,or 3
202        if self.Super > 1:
203            raise self.ImportException("Supersymmetry too high; GSAS-II limited to (3+1) supersymmetry")           
204        return True
205
206    def Reader(self,filename, ParentFrame=None, **unused):
207        'Read the file'
208        TwDict = {}
209        TwSet = {}
210        TwMax = [-1,[]]
211        first = True
212        fp = open(filename,'r')
213        m1 = 0
214        for line,S in enumerate(fp):
215            self.errors = '  Error reading line '+str(line+1)
216            if self.Super == 0:
217                SH = S[:12]
218                SF = S[12:32]
219                h,k,l = SH.split()
220                Fo,sigFo,Tw = SF.split()
221#                    h,k,l,Fo,sigFo,Tw = S[:4],S[4:8],S[8:12],S[12:20],S[20:28],S[28:32]
222                h,k,l = [int(h),int(k),int(l)]
223            elif self.Super == 1:
224                SH = S[:16]
225                SF = S[16:36]
226                h,k,l,m1 = SH.split()
227                Fo,sigFo,Tw = SF.split()
228#                    h,k,l,m1,Fo,sigFo,Tw = S[:4],S[4:8],S[8:12],S[12:16],S[16:24],S[24:32],S[32:36]
229                h,k,l,m1 = [int(h),int(k),int(l),int(m1)]
230            Tw = Tw.strip()
231            if Tw in ['','0']:
232                Tw = '1'
233            if not any([h,k,l,m1]):
234                break
235            if '-' in Tw:
236                if Tw == '-1':  #fix reversed twin ids
237                    Tw = '-2'
238                    if first:
239                        self.warnings += '\nPrimary twin id changed to 1'
240                        first = False
241                TwId = -int(Tw)-1
242                TwSet[TwId] = np.array([h,k,l])
243                if TwId not in TwMax[1]:
244                    TwMax[1].append(TwId)
245            else:
246                if Tw != '1':  #fix reversed twin ids
247                    if first:
248                        self.warnings += '\nPrimary twin id changed to 1\nNB: multiple primary twins not working'
249                        first = False
250                    Tw = '1'
251                TwId = int(Tw)-1
252                if TwSet:
253                    TwDict[len(self.RefDict['RefList'])] = TwSet
254                    TwSet = {}   
255                Fo = float(Fo)
256                sigFo = float(sigFo)
257                # h,k,l,m,dsp,Fo2,sig,Fc2,Fot2,Fct2,phase,...
258                if self.Super == 0:
259                    self.RefDict['RefList'].append([h,k,l,int(Tw),0,Fo,sigFo,0,Fo,0,0,0])
260                elif self.Super == 1:
261                    self.RefDict['RefList'].append([h,k,l,m1,int(Tw),0,Fo,sigFo,0,Fo,0,0,0])
262            TwMax[0] = max(TwMax[0],TwId)
263        fp.close()
264        self.errors = 'Error after reading reflections (unexpected!)'
265        self.RefDict['RefList'] = np.array(self.RefDict['RefList'])
266        self.RefDict['Type'] = 'SXC'
267        self.RefDict['Super'] = self.Super
268        self.RefDict['TwDict'] = TwDict
269        self.RefDict['TwMax'] = TwMax
270        self.UpdateParameters(Type='SXC',Wave=None) # histogram type
271        return True
272
273class SHELX6_ReaderClass(G2obj.ImportStructFactor):
274    'Routines to import F**2, sig(F**2) twin/incommensurate reflections from a fixed format SHELX HKLF6 file'
275    def __init__(self):
276        if 'linux' in sys.platform:  # wx 3.0.0.0 on gtk does not like Unicode in menus
277            formatName = 'Shelx HKLF 6 F2 Tw/Incom'
278            longFormatName = 'Shelx HKLF 6 [hklm, Fo2, sig(Fo2), Tind] Twin/incommensurate structure factor text file'
279        else:
280            formatName = u'Shelx HKLF 6 F\u00b2 Tw/Incom'
281            longFormatName = u'Shelx HKLF 6 [hklm, Fo\u00b2, sig(Fo\u00b2), Tind] Twin/incommensurate structure factor text file'       
282        super(self.__class__,self).__init__( # fancy way to self-reference
283            extensionlist=('.hk6','.HK6'),
284            strictExtension=False,
285            formatName=formatName,
286            longFormatName=longFormatName)
287        self.Super = 0
288
289    def ContentsValidator(self, filename):
290        '''Discover how many columns before F^2 are in the SHELX HKL6 file
291        - could be 3-6 depending on satellites'''
292        numCols = 0
293        fp = open(filename,'r')
294        for i,line in enumerate(fp):
295            for j,item in enumerate(line.split()):  #find 1st col with '.'; has F^2
296                if '.' in item:
297                    numCols = max(numCols,j)
298                    break
299            if i > 20:
300                break
301        fp.close()
302        if numCols != 6:
303            self.warnings += '\nInvalid hk6 file; wrong number of columns'
304            raise self.ImportException('Invalid hk6 file; wrong number of columns')
305        self.Super = 1
306        return True
307
308    def Reader(self,filename, ParentFrame=None, **unused):
309        'Read the file'
310        TwDict = {}
311        TwSet = {}
312        TwMax = [-1,[]]
313        first = True
314        fp = open(filename,'r')
315        for line,S in enumerate(fp):
316            self.errors = '  Error reading line '+str(line+1)
317            h,k,l,m1,m2,m3,Fo,sigFo,Tw = S[:4],S[4:8],S[8:12],S[12:16],S[16:20],S[20:24],S[24:32],S[32:40],S[40:44]
318            h,k,l,m1,m2,m3 = [int(h),int(k),int(l),int(m1),int(m2),int(m3)]
319            if m2 or m3:
320                self.warnings += '\n(3+2) & (3+3) Supersymmetry not allowed in GSAS-II. Reformulate as twinned (3+1) supersymmetry'
321                raise self.ImportException("Supersymmetry too high; GSAS-II limited to (3+1) supersymmetry")                               
322            Tw = Tw.strip()
323            if Tw in ['','0']:
324                Tw = '1'
325            if not any([h,k,l]):    #look for 0 0 0 or blank line
326                break
327            if '-' in Tw:
328                if Tw == '-1':  #fix reversed twin ids
329                    Tw = '-2'
330                    if first:
331                        self.warnings += '\nPrimary twin id changed to 1'
332                        first = False
333                TwId = -int(Tw)-1
334                TwSet[TwId] = np.array([h,k,l])
335                if TwId not in TwMax[1]:
336                    TwMax[1].append(TwId)
337            else:
338                if Tw != '1':  #fix reversed twin ids
339                    if first:
340                        self.warnings += '\nPrimary twin id changed to 1\nNB: multiple primary twins not working'
341                        first = False
342                    Tw = '1'
343                TwId = int(Tw)-1
344                if TwSet:
345                    TwDict[len(self.RefDict['RefList'])] = TwSet
346                    TwSet = {}   
347                Fo = float(Fo)
348                sigFo = float(sigFo)
349                # h,k,l,m,dsp,Fo2,sig,Fc2,Fot2,Fct2,phase,...
350                self.RefDict['RefList'].append([h,k,l,m1,int(Tw),0,Fo,sigFo,0,Fo,0,0,0])
351            TwMax[0] = max(TwMax[0],TwId)
352        fp.close()
353        self.errors = 'Error after reading reflections (unexpected!)'
354        self.RefDict['RefList'] = np.array(self.RefDict['RefList'])
355        self.RefDict['Type'] = 'SXC'
356        self.RefDict['Super'] = self.Super
357        self.RefDict['TwDict'] = TwDict
358        self.RefDict['TwMax'] = TwMax
359        self.UpdateParameters(Type='SXC',Wave=None) # histogram type
360        return True
361
362class M90_ReaderClass(G2obj.ImportStructFactor):
363    'Routines to import F**2, sig(F**2) reflections from a JANA M90 file'
364    def __init__(self):
365        if 'linux' in sys.platform:  # wx 3.0.0.0 on gtk does not like Unicode in menus
366            longFormatName = 'JANA [hkl, Fo2, sig(Fo2)] Structure factor text file'
367        else:
368            longFormatName = u'JANA [hkl, Fo\u00b2, sig(Fo\u00b2)] Structure factor text file'
369        super(self.__class__,self).__init__( # fancy way to self-reference
370            extensionlist=('.m90','.M90'),
371            strictExtension=False,
372            formatName = u'JANA M90',
373            longFormatName = longFormatName
374            )
375        self.Super = 0
376
377    def ContentsValidator(self, filename):
378        'Discover how many columns are in the m90 file - could be 9-12 depending on satellites'
379        numCols = 0
380        fp = open(filename,'r')
381        for i,line in enumerate(fp):
382            if 'Data' in line:
383                startData = i
384                break
385        for i,line in enumerate(fp):
386            if i > startData:
387                numCols = max(numCols,len(line.split()))
388            if i > startData+20:
389                break
390        fp.close()
391        self.Super = numCols-9     #= 0,1,2,or 3
392        if self.Super > 1:
393            raise self.ImportException("Supersymmetry too high; GSAS-II limited to (3+1) supersymmetry")           
394        return True #ColumnValidator(self, filepointer)
395
396    def Reader(self,filename,filepointer, ParentFrame=None, **unused):
397        'Read the file'
398        fp = open(filename,'r')
399        for line,S in enumerate(fp):
400            self.errors = '  Error reading line '+str(line+1)
401            if S[0] == '#': continue       #ignore comments, if any
402            try:
403                if self.Super == 0:
404                    h,k,l,Fo,sigFo = S.split()[:5]
405                    h,k,l = [int(h),int(k),int(l)]
406                elif self.Super == 1:
407                    h,k,l,m1,Fo,sigFo = S.split()[:6]
408                    h,k,l,m1 = [int(h),int(k),int(l),int(m1)]
409            except ValueError:  #skipping text at front
410                if not S:
411                    break
412                text = S.split()
413                if text[0] == 'lambda':
414                    wave = float(text[1])
415                continue
416            Fo = float(Fo)
417            sigFo = float(sigFo)
418            # h,k,l,m,dsp,Fo2,sig,Fc2,Fot2,Fct2,phase,...
419            if self.Super == 0:
420                self.RefDict['RefList'].append([h,k,l,1,0,Fo,sigFo,0,Fo,0,0,0])
421            elif self.Super == 1:
422                self.RefDict['RefList'].append([h,k,l,m1,1,0,Fo,sigFo,0,Fo,0,0,0])
423        fp.close()
424        self.errors = 'Error after reading reflections (unexpected!)'
425        self.RefDict['RefList'] = np.array(self.RefDict['RefList'])
426        self.RefDict['Type'] = 'SXC'
427        self.RefDict['Super'] = self.Super
428        self.UpdateParameters(Type='SXC',Wave=wave) # histogram type
429        return True
430           
431class NT_HKLF2_ReaderClass(G2obj.ImportStructFactor):
432    'Routines to import neutron TOF F**2, sig(F**2) reflections from a HKLF file'
433    def __init__(self):
434        if 'linux' in sys.platform:  # wx 3.0.0.0 on gtk does not like Unicode in menus
435            formatName = 'Neutron SNS TOF HKL F2'
436            longFormatName = 'Neutron SNS TOF [hkl, Fo2, sig(Fo2),...] Structure factor text file'
437        else:
438            formatName = u'Neutron SNS TOF HKL F\u00b2'
439            longFormatName = u'Neutron SNS TOF [hkl, Fo\u00b2, sig(Fo\u00b2),...] Structure factor text file'
440        super(self.__class__,self).__init__( # fancy way to self-reference
441            extensionlist=('.hkl','.HKL'),
442            strictExtension=False,
443            formatName=formatName,
444            longFormatName=longFormatName)
445
446    def ContentsValidator(self, filename):
447        'Make sure file contains the expected columns on numbers & count number of data blocks - "Banks"'
448        oldNo = -1
449        fp = open(filename,'r')
450        for line,S in enumerate(fp):
451            if not S:   #empty line terminates read
452                break
453            if S[0] == '#': continue       #ignore comments, if any
454            if S.split()[:3] == ['0','0','0']:
455                break
456            bankNo = S.split()[5]
457            if bankNo != oldNo:
458                self.Banks.append({'RefDict':{'RefList':[],}})
459                oldNo = bankNo
460        fp.seek(0)
461        valid = ColumnValidator(self, fp,nCol=8)
462        fp.close()
463        return valid
464
465    def Reader(self,filename, ParentFrame=None, **unused):
466        'Read the file'
467        fp = open(filename,'r')
468        for line,S in enumerate(fp):
469            if not S:
470                break
471            self.errors = '  Error reading line '+str(line+1)
472            if S[0] == '#': continue       #ignore comments, if any
473            data = S.split()
474            h,k,l,Fo,sigFo,bN,wave,tbar = data[:8]  #bN = 1..., 6 dir cos next                   
475            h,k,l = [int(h),int(k),int(l)]
476            if not any([h,k,l]):
477                break
478            Fo = float(Fo)
479            sigFo = float(sigFo)
480            wave = float(wave)
481            tbar = float(tbar)
482            if len(self.Banks):
483                self.Banks[int(bN)-1]['RefDict']['RefList'].append([h,k,l,1,0,Fo,sigFo,0,Fo,0,0,0,wave,tbar])
484            else:
485            # h,k,l,m,dsp,Fo2,sig,Fc2,Fot2,Fct2,phase,...
486                self.RefDict['RefList'].append([h,k,l,1,0,Fo,sigFo,0,Fo,0,0,0,wave,tbar])
487        fp.close()
488        if len(self.Banks):
489            self.UpdateParameters(Type='SNT',Wave=None) # histogram type
490            for Bank in self.Banks:
491                Bank['RefDict']['RefList'] = np.array(Bank['RefDict']['RefList'])
492                Bank['RefDict']['Type'] = 'SNT'                   
493                Bank['RefDict']['Super'] = 0
494        else:
495            self.RefDict['RefList'] = np.array(self.RefDict['RefList'])
496            self.RefDict['Type'] = 'SNT'
497            self.RefDict['Super'] = 0
498            self.errors = 'Error after reading reflections (unexpected!)'
499            self.UpdateParameters(Type='SNT',Wave=None) # histogram type
500        return True
501
502class NT_JANA2K_ReaderClass(G2obj.ImportStructFactor):
503    'Routines to import neutron TOF F**2, sig(F**2) reflections from a JANA2000 file'
504    def __init__(self):
505        if 'linux' in sys.platform:  # wx 3.0.0.0 on gtk does not like Unicode in menus
506            formatName = 'Neutron TOF JANA2000 F2'
507            longFormatName = 'Neutron TOF [hkl, Fo2, sig(Fo2),...] Structure factor text file'
508        else:
509            formatName = u'Neutron TOF JANA2000 F\u00b2'
510            longFormatName = u'Neutron TOF [hkl, Fo\u00b2, sig(Fo\u00b2),...] Structure factor text file'
511        super(self.__class__,self).__init__( # fancy way to self-reference
512            extensionlist=('.int','.INT'),
513            strictExtension=False,
514            formatName=formatName,
515            longFormatName=longFormatName)
516
517    def ContentsValidator(self, filename):
518        'Make sure file contains the expected columns on numbers & count number of data blocks - "Banks"'
519        oldNo = -1
520        fp = open(filename,'r')
521        for line,S in enumerate(fp):
522            if not S:   #empty line terminates read
523                break
524            if S[0] in ['#','(']: continue       #ignore comments & fortran format line
525            bankNo = S.split()[5]
526            if bankNo != oldNo:
527                self.Banks.append({'RefDict':{'RefList':[],}})
528                oldNo = bankNo
529        fp.seek(0)
530        valid = ColumnValidator(self, fp,nCol=10)
531        fp.close()
532        return valid
533
534    def Reader(self,filename,filepointer, ParentFrame=None, **unused):
535        'Read the file'
536        fp = open(filename,'r')
537        for line,S in enumerate(fp):
538            self.errors = '  Error reading line '+str(line+1)
539            if S[0] in ['#','(']: continue       #ignore comments & fortran format line
540            data = S.split()
541            h,k,l,Fo,sigFo,bN,wave,x,x,tbar = data[:10]  #bN = 1..., 6 dir cos next                   
542            h,k,l = [int(h),int(k),int(l)]
543            if not any([h,k,l]):
544                break
545            Fo = float(Fo)
546            sigFo = float(sigFo)
547            wave = float(wave)
548            tbar = float(tbar)
549            if len(self.Banks):
550                self.Banks[int(bN)-1]['RefDict']['RefList'].append([h,k,l,1,0,Fo,sigFo,0,Fo,0,0,0,wave,tbar])
551            else:
552            # h,k,l,m,dsp,Fo2,sig,Fc2,Fot2,Fct2,phase,...
553                self.RefDict['RefList'].append([h,k,l,1,0,Fo,sigFo,0,Fo,0,0,0,wave,tbar])
554        fp.close()
555        if len(self.Banks):
556            self.UpdateParameters(Type='SNT',Wave=None) # histogram type
557            for Bank in self.Banks:
558                Bank['RefDict']['RefList'] = np.array(Bank['RefDict']['RefList'])
559                Bank['RefDict']['Type'] = 'SNT'                   
560                Bank['RefDict']['Super'] = 0        #for now                   
561        else:
562            self.RefDict['RefList'] = np.array(self.RefDict['RefList'])
563            self.RefDict['Type'] = 'SNT'
564            self.RefDict['Super'] = 0   #for now
565            self.errors = 'Error after reading reflections (unexpected!)'
566            self.UpdateParameters(Type='SNT',Wave=None) # histogram type
567        return True
568
569class NIST_hb3a_INT_ReaderClass(G2obj.ImportStructFactor):
570    'Routines to import neutron CW F**2, sig(F**2) reflections from a NIST hb3a int file'
571    def __init__(self):
572        if 'linux' in sys.platform:  # wx 3.0.0.0 on gtk does not like Unicode in menus
573            formatName = u'Neutron NIST hb3a  CW HKL F2'
574            longFormatName = u'Neutron NIST hb3a  CW HKL [hkl, Fo2, sig(Fo2),...] 5 column Structure factor text file'
575        else:
576            formatName = u'Neutron NIST hb3a  CW HKL F\u00b2'
577            longFormatName = u'Neutron NIST hb3a  CW HKL [hkl, Fo\u00b2, sig(Fo\u00b2),...] 5 column Structure factor text file'
578        super(self.__class__,self).__init__( # fancy way to self-reference
579            extensionlist=('.int','.INT'),
580            strictExtension=False,
581            formatName=formatName,
582            longFormatName=longFormatName)
583
584    def ContentsValidator(self, filename):
585        'Make sure file contains the expected columns on numbers & count number of data blocks - "Banks"'
586        fp = open(filename,'r')
587        for line,S in enumerate(fp):
588            if not S:   #empty line terminates read
589                break
590            if S[0] == '#': continue       #ignore comments, if any
591        fp.seek(0)
592        valid = ColumnValidator(self, fp,nCol=5)
593        fp.close()
594        return valid
595
596    def Reader(self,filename,filepointer, ParentFrame=None, **unused):
597        'Read the file'
598        fp = open(filename,'r')
599        for line,S in enumerate(fp):
600            self.errors = '  Error reading line '+str(line+1)
601            if S[0] == '#': continue       #ignore comments, if any
602            data = S.split()
603            h,k,l,Fo,sigFo = data                   
604            h,k,l = [int(h),int(k),int(l)]
605            if not any([h,k,l]):
606                break
607            Fo = float(Fo)
608            sigFo = float(sigFo)
609            # h,k,l,m,dsp,Fo2,sig,Fc2,Fot2,Fct2,phase,...
610            self.RefDict['RefList'].append([h,k,l,1,0,Fo,sigFo,0,Fo,0,0,0])
611        fp.close()
612        self.RefDict['RefList'] = np.array(self.RefDict['RefList'])
613        self.RefDict['Type'] = 'SNC'
614        self.RefDict['Super'] = 0
615        self.errors = 'Error after reading reflections (unexpected!)'
616        self.UpdateParameters(Type='SNC',Wave=None) # histogram type
617        return True
Note: See TracBrowser for help on using the repository browser.