source: trunk/imports/G2phase_INS.py @ 2286

Last change on this file since 2286 was 2286, checked in by vondreele, 6 years ago

fix problems in INS importer

File size: 5.6 KB
Line 
1# -*- coding: utf-8 -*-
2########### SVN repository information ###################
3# $Date: 2015-04-27 13:22:06 -0500 (Mon, 27 Apr 2015) $
4# $Author: vondreele $
5# $Revision: 1812 $
6# $URL: https://subversion.xray.aps.anl.gov/pyGSAS/trunk/imports/G2phase_GPX.py $
7# $Id: G2phase_GPX.py 1812 2015-04-27 18:22:06Z vondreele $
8########### SVN repository information ###################
9'''
10*Module G2phase_INS: Import phase from SHELX INS file*
11--------------------------------------------------------
12
13Copies a phase from SHELX ins file into the
14current project.
15
16'''
17import sys
18import traceback
19import math
20import numpy as np
21import random as ran
22import GSASIIIO as G2IO
23import GSASIIspc as G2spc
24import GSASIIlattice as G2lat
25import GSASIIpath
26GSASIIpath.SetVersionNumber("$Revision: 1812 $")
27
28class PhaseReaderClass(G2IO.ImportPhase):
29    'Opens a .INS file and pulls out a selected phase'
30    def __init__(self):
31        super(self.__class__,self).__init__( # fancy way to say ImportPhase.__init__
32            extensionlist=('.ins','.INS'),
33            strictExtension=True,
34            formatName = 'SHELX ins',
35            longFormatName = 'SHELX input (*.ins) file import'
36            )
37       
38    def ContentsValidator(self, filepointer):
39        "Test if the ins file has a CELL record"
40        for i,l in enumerate(filepointer):
41            if l.startswith('CELL'):
42                break
43        else:
44            self.errors = 'no CELL record found'
45            self.errors = 'This is not a valid .ins file.'
46            return False
47        return True
48
49    def Reader(self,filename,filepointer, ParentFrame=None, **unused):
50        'Read a ins file using :meth:`ReadINSPhase`'
51        try:
52            self.Phase = self.ReadINSPhase(filename, ParentFrame)
53            return True
54        except Exception as detail:
55            self.errors += '\n  '+str(detail)
56            print 'INS read error:',detail # for testing
57            traceback.print_exc(file=sys.stdout)
58            return False
59
60    def ReadINSPhase(self,filename,parent=None):
61        '''Read a phase from a INS file.
62        '''
63        EightPiSq = 8.*math.pi**2
64        self.errors = 'Error opening file'
65        file = open(filename, 'Ur')
66        Phase = {}
67        Title = ''
68        Compnd = ''
69        Atoms = []
70        aTypes = []
71        A = np.zeros(shape=(3,3))
72        S = file.readline()
73        line = 1
74        SGData = None
75        cell = None
76        numbs = [str(i) for i in range(10)]
77        while S:
78            if '!' in S:
79                S = S.split('!')[0]
80            self.errors = 'Error reading at line '+str(line)
81            Atom = []
82            Aindx = [ch in numbs for ch in S[:4]]   #False for all letters
83            if 'TITL' in S[:4]:
84                Title = S[4:72].strip()
85            elif 'CELL' in S[:4]:
86                abc = S[12:40].split()
87                angles = S[40:64].split()
88                cell=[float(abc[0]),float(abc[1]),float(abc[2]),
89                    float(angles[0]),float(angles[1]),float(angles[2])]
90                Volume = G2lat.calc_V(G2lat.cell2A(cell))
91                AA,AB = G2lat.cell2AB(cell)
92                SpGrp = 'P 1'
93                SGData = G2IO.SGData # P 1
94                self.warnings += '\nThe space group is not given in an ins file and has been set to "P 1".'
95                self.warnings += "\nChange this in phase's General tab; NB: it might be in the Phase name."
96            elif S[:4] in 'SFAC':
97                aTypes = S[4:].split()
98                if 'H' in aTypes:
99                    self.warnings += '\nHydrogen atoms found; consider replacing them with stereochemically tied ones.'
100                    self.warnings += "\nDo 'Edit/Insert H atoms' in this phase's Atoms tab after deleting the old ones."
101            elif S[0] == 'Q':
102                pass
103            elif np.any(Aindx) or S[:4].strip() in aTypes:   #this will find an atom record!
104                try:
105                    iNum = Aindx.index(True)
106                except ValueError:
107                    iNum = 4
108                Atype = S[:iNum].strip()
109                Aname = S[:4]
110                x,y,z = S[9:45].split()
111                XYZ = np.array([float(x),float(y),float(z)])
112                XYZ = np.where(np.abs(XYZ)<0.00001,0,XYZ)
113                SytSym,Mult = G2spc.SytSym(XYZ,SGData)
114                if '=' not in S:
115                    IA = 'I'
116                    Uiso = float(S[57:68])
117                    if Uiso < 0.:
118                        Uiso = 0.025
119                    Uij = [0. for i in range(6)]
120                else:
121                    IA = 'A'
122                    Uiso = 0.
123                    Ustr = S[57:78].split()
124                    S = file.readline()
125                    if '!' in S:
126                        S = S.split('!')[0]
127                    line += 1
128                    Ustr += S[6:51].split()
129                    Uij = [float(Ustr[i]) for i in range(6)]
130                Atom = [Aname,Atype,'',XYZ[0],XYZ[1],XYZ[2],1.0,SytSym,Mult,IA,Uiso]
131                Atom += Uij
132                Atom.append(ran.randint(0,sys.maxint))
133                Atoms.append(Atom)
134            S = file.readline()
135            line += 1
136        file.close()
137        self.errors = 'Error after read complete'
138        Phase = G2IO.SetNewPhase(Name='ShelX phase',SGData=SGData,cell=cell+[Volume,])
139        Phase['General']['Name'] = Title
140        Phase['General']['Type'] = 'nuclear'
141        Phase['General']['AtomPtrs'] = [3,1,7,9]
142        Phase['Atoms'] = Atoms
143        return Phase
Note: See TracBrowser for help on using the repository browser.