source: trunk/imports/G2phase_INS.py @ 2287

Last change on this file since 2287 was 2287, checked in by vondreele, 7 years ago

more changes to import Shelx INS,RES files

File size: 6.4 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','.res','.RES'),
33            strictExtension=True,
34            formatName = 'SHELX ins,res',
35            longFormatName = 'SHELX input (*.ins, *.res) 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        Shelx = ['TITL','CELL','ZERR','LATT','SYMM','SFAC','DISP','UNIT','LAUE','EADP',
64            'MORE','TIME','END ','HKLF','OMIT','SHEL','BASF','TWIN','EXTI','SWAT',
65            'HOPE','MERG','SPEC','RESI','RTAB','MPLA','HFIX','MOVE','ANIS','AFIX',
66            'FRAG','FEND','EXYZ','EDAP','EQIV','CONN','PART','BIND','FREE','DFIX','DANG',
67            'BUMP','SAME','SADI','CHIV','FLAT','DELU','SIMU','DEFS','ISOR','NCSY',
68            'SUMP','L.S.','CGLS','BLOC','DAMP','STIR','WGHT','FVAR','BOND','CONF','MPLA',
69            'HTAB','LIST','ACTA','SIZE','TEMP','WPDB','FMAP','GRID','PLAN','MOLE']
70        EightPiSq = 8.*math.pi**2
71        self.errors = 'Error opening file'
72        file = open(filename, 'Ur')
73        Phase = {}
74        Title = ''
75        Compnd = ''
76        Atoms = []
77        aTypes = []
78        A = np.zeros(shape=(3,3))
79        S = file.readline()
80        line = 1
81        SGData = None
82        cell = None
83        numbs = [str(i) for i in range(10)]
84        while S:
85            if '!' in S:
86                S = S.split('!')[0]
87            self.errors = 'Error reading at line '+str(line)
88            Atom = []
89            Aindx = [ch in numbs for ch in S[:4]]   #False for all letters
90            if 'TITL' in S[:4].upper():
91                Title = S[4:72].strip()
92            elif not S.strip():
93                pass
94            elif 'CELL' in S[:4].upper():
95                cellRec = S.split()
96                abc = cellRec[2:5]
97                angles = cellRec[5:8]
98                cell=[float(abc[0]),float(abc[1]),float(abc[2]),
99                    float(angles[0]),float(angles[1]),float(angles[2])]
100                Volume = G2lat.calc_V(G2lat.cell2A(cell))
101                AA,AB = G2lat.cell2AB(cell)
102                SpGrp = 'P 1'
103                SGData = G2IO.SGData # P 1
104                self.warnings += '\nThe space group is not given in an ins file and has been set to "P 1".'
105                self.warnings += "\nChange this in phase's General tab; NB: it might be in the Phase name."
106            elif S[:4].upper() in 'SFAC':
107                aTypes = S[4:].split()
108                if 'H' in aTypes:
109                    self.warnings += '\nHydrogen atoms found; consider replacing them with stereochemically tied ones.'
110                    self.warnings += "\nDo 'Edit/Insert H atoms' in this phase's Atoms tab after deleting the old ones."
111            elif S[0] == 'Q':
112                pass
113            elif '\x1a' in S[:4]:
114                pass
115            elif S[:3].upper() == 'REM':
116                pass
117            elif S[:4].upper() not in Shelx:   #this will find an atom record!
118                AtRec = S.split()
119                Atype = aTypes[int(AtRec[1])-1]
120                Aname = AtRec[0]
121                Afrac = abs(float(AtRec[5]))%10.
122                x,y,z = AtRec[2:5]
123                XYZ = np.array([float(x),float(y),float(z)])
124                XYZ = np.where(np.abs(XYZ)<0.00001,0,XYZ)
125                SytSym,Mult = G2spc.SytSym(XYZ,SGData)
126                if '=' not in S:
127                    IA = 'I'
128                    Uiso = float(AtRec[6])
129                    if Uiso < 0.:
130                        Uiso = 0.025
131                    Uij = [0. for i in range(6)]
132                else:
133                    IA = 'A'
134                    Uiso = 0.
135                    Ustr = AtRec[6:8]
136                    S = file.readline()
137                    if '!' in S:
138                        S = S.split('!')[0]
139                    AtRec = S.split()
140                    line += 1
141                    Ustr += AtRec
142                    Uij = [float(Ustr[i]) for i in range(6)]
143                    Uij = Uij[0:3]+[Uij[5],Uij[4],Uij[3]]
144                Atom = [Aname,Atype,'',XYZ[0],XYZ[1],XYZ[2],Afrac,SytSym,Mult,IA,Uiso]
145                Atom += Uij
146                Atom.append(ran.randint(0,sys.maxint))
147                Atoms.append(Atom)
148            S = file.readline()
149            line += 1
150        file.close()
151        self.errors = 'Error after read complete'
152        Phase = G2IO.SetNewPhase(Name='ShelX phase',SGData=SGData,cell=cell+[Volume,])
153        Phase['General']['Name'] = Title
154        Phase['General']['Type'] = 'nuclear'
155        Phase['General']['AtomPtrs'] = [3,1,7,9]
156        Phase['Atoms'] = Atoms
157        return Phase
Note: See TracBrowser for help on using the repository browser.