source: trunk/imports/G2sfact.py @ 4847

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

Add (TBD) hide/showtoggle for single crystal systematic extinctions in Reflection list
fix conversion of Uiso to Uij when Uij == 0
fix SHELX 4 reader

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