source: trunk/imports/G2sfact.py @ 3756

Last change on this file since 3756 was 3756, checked in by vondreele, 3 years ago

add an importer for edited NIST hb3a diffractometer (defunct?)
fixes to allow single crystal refinements with CW neutron data

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