source: trunk/exports/G2export_shelx.py @ 1123

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

add import and export routines to sphinx

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