source: trunk/exports/G2export_shelx.py @ 1102

Last change on this file since 1102 was 1102, checked in by toby, 8 years ago

change exports to always have lists of phases & histograms; new export examples; CIF export fixes

  • Property svn:eol-style set to native
  • Property svn:keywords set to Date Author Revision URL Id
File size: 5.0 KB
Line 
1#!/usr/bin/env python
2# -*- coding: utf-8 -*-
3########### SVN repository information ###################
4# $Date: 2013-10-13 03:47:06 +0000 (Sun, 13 Oct 2013) $
5# $Author: toby $
6# $Revision: 1102 $
7# $URL: trunk/exports/G2export_shelx.py $
8# $Id: G2export_shelx.py 1102 2013-10-13 03:47:06Z toby $
9########### SVN repository information ###################
10'''Code to export coordinates in SHELX format, as best as I can makes sense of it
11'''
12import os.path
13import GSASIIpath
14GSASIIpath.SetVersionNumber("$Revision: 1102 $")
15import GSASIIIO as G2IO
16import GSASIIstrIO as G2stIO
17import GSASIIlattice as G2lat
18import GSASIIspc as G2spc
19
20class ExportPhaseShelx(G2IO.ExportBaseclass):
21    '''Used to create a SHELX .ins file for a phase
22
23    :param wx.Frame G2frame: reference to main GSAS-II frame
24    '''
25    def __init__(self,G2frame):
26        super(self.__class__,self).__init__( # fancy way to say <parentclass>.__init__
27            G2frame=G2frame,
28            formatName = 'SHELX',
29            extension='.ins',
30            longFormatName = 'Export phase as SHELX .ins file'
31            )
32        self.exporttype = ['phase']
33        self.multiple = True
34
35    def Exporter(self,event=None):
36        '''Export as a SHELX .ins file
37        '''
38        import re
39        # the export process starts here
40        # load all of the tree into a set of dicts
41        self.loadTree()
42        # create a dict with refined values and their uncertainties
43        self.loadParmDict()
44        if self.SetupExport(event,                         # set export parameters
45                            AskFile=True
46                            ): return 
47        for phasenam in self.phasenam:
48            phasedict = self.Phases[phasenam] # pointer to current phase info           
49            i = self.Phases[phasenam]['pId']
50            if len(self.phasenam) > 1: # if more than one filename is included, add a phase #
51                nam,ext = os.path.splitext(self.filename)
52                fil = nam+"_"+str(i)+ext
53            else:
54                fil = self.filename
55            fp = self.OpenFile(fil)
56            # title line
57            self.Write("TITL from "+str(self.G2frame.GSASprojectfile)+", phase "+str(phasenam))
58            # get & write cell parameters
59            pfx = str(phasedict['pId'])+'::'
60            A,sigA = G2stIO.cellFill(pfx,phasedict['General']['SGData'],self.parmDict,self.sigDict)
61            self.Write("CELL 0.5 {:.5f} {:.5f} {:.5f} {:.3f} {:.3f} {:.3f}".format(*G2lat.A2cell(A)))
62            # Shelx lattice number
63            lattnum = {'P':1,'I':2,'R':2,'F':3,'A':4,'B':5,'C':6}.get(phasedict['General']['SGData']['SGLatt'],0)
64            if not phasedict['General']['SGData']['SGInv']: lattnum *= -1
65            self.Write("LATT "+str(lattnum))
66            # generate symmetry operations not including centering and center of symmetry
67            for M,T in phasedict['General']['SGData']['SGOps']:
68                sym = G2spc.MT2text(M,T).lower().replace(" ,",", ")
69                self.Write('SYMM '+G2IO.trim(sym))
70            # scan through atom types, count the number of times that each element occurs
71            AtomsList = self.GetAtoms(phasenam)
72            maxmult = 0
73            elemtypes = {}
74            for lbl,typ,mult,xyz,td in AtomsList:
75                maxmult = max(maxmult,mult)
76                typ = re.search('[A-Za-z]+',typ).group(0)
77                typ = typ[0:2]
78                typ = typ[0].upper()+typ[1:].lower()
79                if elemtypes.get(typ) is None:
80                    elemtypes[typ] = 1
81                else:
82                    elemtypes[typ] += 1
83            # create scattering factor record
84            s = "SFAC"
85            elemlist = sorted(elemtypes)
86            for elem in elemlist:
87                s += " " + elem
88            self.Write(s)
89            # handle atom records
90            count = {}
91            for lbl,typ,mult,xyz,td in AtomsList:
92                typ = re.search('[A-Za-z]+',typ).group(0)
93                typ = typ[0:2]
94                typ = typ[0].upper()+typ[1:].lower()
95                if count.get(typ) is None:
96                    count[typ] = 0
97                else:
98                    count[typ] += 1
99                # make a unique <=4 character label, if possible
100                if elemtypes[typ] <= 99:
101                    lbl = "{:s}{:d}".format(typ,count[typ])
102                else: # more than 99 atoms, use hexadecimal notation
103                    lbl = typ + "{:X}".format(count[typ])[-2:]
104                sfnum = elemlist.index(typ)+1 # element number in scattering factor list
105                l = lbl+" "+str(sfnum)
106                l += " {:.5f} {:.5f} {:.5f}".format(*[x[0] for x in xyz[:3]])
107                if mult == maxmult:
108                    m = 1
109                else:
110                    m = 1.*mult/maxmult
111                if xyz[3][0] == 1: # frac
112                    occ = 10 + m
113                else:
114                    occ = m * xyz[3][0]
115                l += " {:.3f}".format(occ)
116                for val,sig in td:
117                    l += " {:.3f}".format(val)                   
118                self.Write(l)
119            self.CloseFile()
120            print('Phase '+str(phasenam)+' written to file '+str(fil))
Note: See TracBrowser for help on using the repository browser.