source: trunk/imports/G2sfact.py @ 3136

Last change on this file since 3136 was 3136, checked in by vondreele, 4 years ago

make GSAS-II python 3.6 compliant & preserve python 2.7 use;changes:
do from future import division, print_function for all GSAS-II py sources
all menu items revised to be py 2.7/3.6 compliant
all wx.OPEN --> wx.FD_OPEN in file dialogs
all integer divides (typically for image pixel math) made explicit with ; ambiguous ones made floats as appropriate
all print "stuff" --> print (stuff)
all print >> pFile,'stuff' --> pFile.writeCIFtemplate('stuff')
all read file opens made explicit 'r' or 'rb'
all cPickle imports made for py2.7 or 3.6 as cPickle or _pickle; test for '2' platform.version_tuple[0] for py 2.7
define cPickleload to select load(fp) or load(fp,encoding='latin-1') for loading gpx files; provides cross compatibility between py 2.7/3.6 gpx files
make dict.keys() as explicit list(dict.keys()) as needed (NB: possible source of remaining py3.6 bugs)
make zip(a,b) as explicit list(zip(a,b)) as needed (NB: possible source of remaining py3.6 bugs)
select unichr/chr according test for '2' platform.version_tuple[0] for py 2.7 (G2pwdGUI * G2plot) for special characters
select wg.EVT_GRID_CELL_CHANGE (classic) or wg.EVT_GRID_CELL_CHANGED (phoenix) in grid Bind
maxint --> maxsize; used in random number stuff
raise Exception,"stuff" --> raise Exception("stuff")
wx 'classic' sizer.DeleteWindows?() or 'phoenix' sizer.Clear(True)
wx 'classic' SetToolTipString?(text) or 'phoenix' SetToolTip?(wx.ToolTip?(text)); define SetToolTipString?(self,text) to handle the choice in plots
status.SetFields? --> status.SetStatusText?
'classic' AddSimpleTool? or 'phoenix' self.AddTool? for plot toolbar; Bind different as well
define GetItemPydata? as it doesn't exist in wx 'phoenix'
allow python versions 2.7 & 3.6 to run GSAS-II
Bind override commented out - no logging capability (NB: remove all logging code?)
all import ContentsValidator? open filename & test if valid then close; filepointer removed from Reader
binary importers (mostly images) test for 'byte' type & convert as needed to satisfy py 3.6 str/byte rules

  • Property svn:eol-style set to native
  • Property svn:keywords set to Date Author Revision URL Id
File size: 27.1 KB
Line 
1# -*- coding: utf-8 -*-
2########### SVN repository information ###################
3# $Date: 2017-10-23 16:39:16 +0000 (Mon, 23 Oct 2017) $
4# $Author: vondreele $
5# $Revision: 3136 $
6# $URL: trunk/imports/G2sfact.py $
7# $Id: G2sfact.py 3136 2017-10-23 16:39:16Z 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: 3136 $")
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        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]):
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 TOF HKL F2'
434            longFormatName = 'Neutron TOF [hkl, Fo2, sig(Fo2),...] Structure factor text file'
435        else:
436            formatName = u'Neutron TOF HKL F\u00b2'
437            longFormatName = u'Neutron 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            self.errors = '  Error reading line '+str(line+1)
468            if S[0] == '#': continue       #ignore comments, if any
469            data = S.split()
470            h,k,l,Fo,sigFo,bN,wave,tbar = data[:8]  #bN = 1..., 6 dir cos next                   
471            h,k,l = [int(h),int(k),int(l)]
472            if not any([h,k,l]):
473                break
474            Fo = float(Fo)
475            sigFo = float(sigFo)
476            wave = float(wave)
477            tbar = float(tbar)
478            if len(self.Banks):
479                self.Banks[int(bN)-1]['RefDict']['RefList'].append([h,k,l,1,0,Fo,sigFo,0,Fo,0,0,0,wave,tbar])
480            else:
481            # h,k,l,m,dsp,Fo2,sig,Fc2,Fot2,Fct2,phase,...
482                self.RefDict['RefList'].append([h,k,l,1,0,Fo,sigFo,0,Fo,0,0,0,wave,tbar])
483        fp.close()
484        if len(self.Banks):
485            self.UpdateParameters(Type='SNT',Wave=None) # histogram type
486            for Bank in self.Banks:
487                Bank['RefDict']['RefList'] = np.array(Bank['RefDict']['RefList'])
488                Bank['RefDict']['Type'] = 'SNT'                   
489                Bank['RefDict']['Super'] = 0
490        else:
491            self.RefDict['RefList'] = np.array(self.RefDict['RefList'])
492            self.RefDict['Type'] = 'SNT'
493            self.RefDict['Super'] = 0
494            self.errors = 'Error after reading reflections (unexpected!)'
495            self.UpdateParameters(Type='SNT',Wave=None) # histogram type
496        return True
497
498class NT_JANA2K_ReaderClass(G2obj.ImportStructFactor):
499    'Routines to import neutron TOF F**2, sig(F**2) reflections from a JANA2000 file'
500    def __init__(self):
501        if 'linux' in sys.platform:  # wx 3.0.0.0 on gtk does not like Unicode in menus
502            formatName = 'Neutron TOF JANA2000 F2'
503            longFormatName = 'Neutron TOF [hkl, Fo2, sig(Fo2),...] Structure factor text file'
504        else:
505            formatName = u'Neutron TOF JANA2000 F\u00b2'
506            longFormatName = u'Neutron TOF [hkl, Fo\u00b2, sig(Fo\u00b2),...] Structure factor text file'
507        super(self.__class__,self).__init__( # fancy way to self-reference
508            extensionlist=('.int','.INT'),
509            strictExtension=False,
510            formatName=formatName,
511            longFormatName=longFormatName)
512
513    def ContentsValidator(self, filename):
514        'Make sure file contains the expected columns on numbers & count number of data blocks - "Banks"'
515        oldNo = -1
516        fp = open(filename,'r')
517        for line,S in enumerate(fp):
518            if not S:   #empty line terminates read
519                break
520            if S[0] in ['#','(']: continue       #ignore comments & fortran format line
521            bankNo = S.split()[5]
522            if bankNo != oldNo:
523                self.Banks.append({'RefDict':{'RefList':[],}})
524                oldNo = bankNo
525        fp.seek(0)
526        valid = ColumnValidator(self, fp,nCol=10)
527        fp.close()
528        return valid
529
530    def Reader(self,filename,filepointer, ParentFrame=None, **unused):
531        'Read the file'
532        fp = open(filename,'r')
533        for line,S in enumerate(fp):
534            self.errors = '  Error reading line '+str(line+1)
535            if S[0] in ['#','(']: continue       #ignore comments & fortran format line
536            data = S.split()
537            h,k,l,Fo,sigFo,bN,wave,x,x,tbar = data[:10]  #bN = 1..., 6 dir cos next                   
538            h,k,l = [int(h),int(k),int(l)]
539            if not any([h,k,l]):
540                break
541            Fo = float(Fo)
542            sigFo = float(sigFo)
543            wave = float(wave)
544            tbar = float(tbar)
545            if len(self.Banks):
546                self.Banks[int(bN)-1]['RefDict']['RefList'].append([h,k,l,1,0,Fo,sigFo,0,Fo,0,0,0,wave,tbar])
547            else:
548            # h,k,l,m,dsp,Fo2,sig,Fc2,Fot2,Fct2,phase,...
549                self.RefDict['RefList'].append([h,k,l,1,0,Fo,sigFo,0,Fo,0,0,0,wave,tbar])
550        fp.close()
551        if len(self.Banks):
552            self.UpdateParameters(Type='SNT',Wave=None) # histogram type
553            for Bank in self.Banks:
554                Bank['RefDict']['RefList'] = np.array(Bank['RefDict']['RefList'])
555                Bank['RefDict']['Type'] = 'SNT'                   
556                Bank['RefDict']['Super'] = 0        #for now                   
557        else:
558            self.RefDict['RefList'] = np.array(self.RefDict['RefList'])
559            self.RefDict['Type'] = 'SNT'
560            self.RefDict['Super'] = 0   #for now
561            self.errors = 'Error after reading reflections (unexpected!)'
562            self.UpdateParameters(Type='SNT',Wave=None) # histogram type
563        return True
564
565class ISIS_SXD_INT_ReaderClass(G2obj.ImportStructFactor):
566    'Routines to import neutron TOF F**2, sig(F**2) reflections from a ISIS int file'
567    def __init__(self):
568        if 'linux' in sys.platform:  # wx 3.0.0.0 on gtk does not like Unicode in menus
569            formatName = u'Neutron SXD TOF HKL F2'
570            longFormatName = u'Neutron SXD TOF [hkl, Fo2, sig(Fo2),...] Structure factor text file'
571        else:
572            formatName = u'Neutron SXD TOF HKL F\u00b2'
573            longFormatName = u'Neutron SXD TOF [hkl, Fo\u00b2, sig(Fo\u00b2),...] Structure factor text file'
574        super(self.__class__,self).__init__( # fancy way to self-reference
575            extensionlist=('.int','.INT'),
576            strictExtension=False,
577            formatName=formatName,
578            longFormatName=longFormatName)
579
580    def ContentsValidator(self, filename):
581        'Make sure file contains the expected columns on numbers & count number of data blocks - "Banks"'
582        oldNo = -1
583        fp = open(filename,'r')
584        for line,S in enumerate(fp):
585            if not S:   #empty line terminates read
586                break
587            if S[0] == '#': continue       #ignore comments, if any
588            if S[0] == '(': continue        #ignore format line
589            bankNo = S.split()[5]
590            if bankNo != oldNo:
591                self.Banks.append({'RefDict':{'RefList':[],}})
592                oldNo = bankNo
593        fp.seek(0)
594        valid = ColumnValidator(self, fp,nCol=8)
595        fp.close()
596        return valid
597
598    def Reader(self,filename,filepointer, ParentFrame=None, **unused):
599        'Read the file'
600        fp = open(filename,'r')
601        for line,S in enumerate(fp):
602            self.errors = '  Error reading line '+str(line+1)
603            if S[0] == '#': continue       #ignore comments, if any
604            if S[0] == '(': continue        #ignore the format line
605            data = S.split()
606            h,k,l,Fo,sigFo,bN,wave,x,x,tbar = data[:10]                   
607            h,k,l = [int(h),int(k),int(l)]
608            if not any([h,k,l]):
609                break
610            Fo = float(Fo)
611            sigFo = float(sigFo)
612            wave = float(wave)
613            tbar = float(tbar)
614            if len(self.Banks):
615                self.Banks[int(bN)-1]['RefDict']['RefList'].append([h,k,l,1,0,Fo,sigFo,0,Fo,0,0,0,wave,tbar])
616            else:
617            # h,k,l,m,dsp,Fo2,sig,Fc2,Fot2,Fct2,phase,...
618                self.RefDict['RefList'].append([h,k,l,1,0,Fo,sigFo,0,Fo,0,0,0,wave,tbar])
619        fp.close()
620        if len(self.Banks):
621            self.UpdateParameters(Type='SNT',Wave=None) # histogram type
622            for Bank in self.Banks:
623                Bank['RefDict']['RefList'] = np.array(Bank['RefDict']['RefList'])
624                Bank['RefDict']['Type'] = 'SNT'                   
625                Bank['RefDict']['Super'] = 0
626        else:
627            self.RefDict['RefList'] = np.array(self.RefDict['RefList'])
628            self.RefDict['Type'] = 'SNT'
629            self.RefDict['Super'] = 0
630            self.errors = 'Error after reading reflections (unexpected!)'
631            self.UpdateParameters(Type='SNT',Wave=None) # histogram type
632        return True
633
Note: See TracBrowser for help on using the repository browser.