Changeset 1077 for trunk/exports


Ignore:
Timestamp:
Oct 3, 2013 1:11:47 PM (8 years ago)
Author:
toby
Message:

cleanup plot & svn bugs; set missing keywords; CIF export done; update docs

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/exports/G2cif.py

    • Property svn:keywords set to Date Author Revision URL Id
    r1074 r1077  
    33#G2cif
    44########### SVN repository information ###################
    5 # $Date: 2013-07-22 20:57:37 -0500 (Mon, 22 Jul 2013) $
    6 # $Author: toby $
    7 # $Revision: 1006 $
    8 # $URL: https://subversion.xray.aps.anl.gov/pyGSAS/trunk/exports/G2cif.py $
    9 # $Id: G2cif.py 1006 2013-07-23 01:57:37Z toby $
     5# $Date$
     6# $Author$
     7# $Revision$
     8# $URL$
     9# $Id$
    1010########### SVN repository information ###################
    11 '''Code to export a GSAS-II project as a CIF
    12 This builds on the data extraction done in method export in the base class
    13 
    14 TODO: set bond pub flags?
    15 TODO: progress bar
    16 TODO: cleanup routine import
    17 
     11'''Code to export a GSAS-II project as a CIF. Variable `self.mode`
     12determines the type of CIF that is created:
     13
     14 * `self.mode="simple"` creates a simple CIF with only coordinates
     15   for at most a single phase (:class:`ExportSimpleCIF`), while
     16
     17 * `self.mode="full"` creates a complete CIF of project (:class:`ExportCIF`).
    1818'''
    19 
    2019
    2120import datetime as dt
     
    3029import wx.lib.resizewidget as rw
    3130import GSASIIpath
    32 GSASIIpath.SetVersionNumber("$Revision: 1006 $")
     31GSASIIpath.SetVersionNumber("$Revision$")
    3332import GSASIIIO as G2IO
    34 #reload(G2IO)
    3533import GSASIIgrid as G2gd
    36 reload(G2gd)
    3734import GSASIIstrIO as G2stIO
    38 #reload(G2stIO)
    39 #import GSASIImapvars as G2mv
    4035import GSASIImath as G2mth
    41 #reload(G2mth)
    4236import GSASIIlattice as G2lat
    4337import GSASIIspc as G2spc
    44 #reload(G2spc)
    4538import GSASIIphsGUI as G2pg
    46 #reload(G2pg)
    4739import GSASIIstrMain as G2stMn
    48 #reload(G2stMn)
    4940
    5041DEBUG = False    #True to skip printing of reflection/powder profile lists
     
    5445class ExportCIF(G2IO.ExportBaseclass):
    5546    '''Used to create a CIF of an entire project
     47
     48    :param wx.Frame G2frame: reference to main GSAS-II frame
    5649    '''
    5750    def __init__(self,G2frame):
     
    6356            )
    6457        self.author = ''
    65 
    66     def export(self,mode='full'):
    67         '''Export a CIF
    68 
    69         :param str mode: "full" (default) to create a complete CIF of project,
    70           "simple" for a simple CIF with only coordinates
     58        self.mode = 'full'
     59        self.exporttype = 'project'
     60
     61    def export(self):
     62        '''Export a CIF. Export can be full or simple (as set by self.mode).
     63        "simple" skips data, distances & angles, etc. and can only include
     64        a single phase while "full" is intended for for publication submission.
    7165        '''
    7266   
     
    685679            Atoms = phasedict['Atoms']
    686680            generalData = phasedict['General']
     681            # create a dict for storing Pub flag for bonds/angles, if needed
     682            if phasedict['General'].get("DisAglHideFlag") is None:
     683                phasedict['General']["DisAglHideFlag"] = {}
     684            DisAngSel = phasedict['General']["DisAglHideFlag"]
    687685            cx,ct,cs,cia = phasedict['General']['AtomPtrs']
    688686            cn = ct-1
     
    751749                    for d in D[1]:
    752750                        line += "{:1d}".format(d+5)
    753                     line += " yes"
     751                    if DisAngSel.get((i,tuple(D[0:3]))):
     752                        line += " no"
     753                    else:
     754                        line += " yes"
    754755                    WriteCIFitem(line)
    755756
     
    781782                    for d in Dk[1]:
    782783                        line += "{:1d}".format(d+5)
    783                     line += " yes"
     784                    key = (tuple(Dk[0:3]),i,tuple(Dj[0:3]))
     785                    if DisAngSel.get(key):
     786                        line += " no"
     787                    else:
     788                        line += " yes"
    784789                    WriteCIFitem(line)
    785790
     
    12511256            parameters (mostly related to templates).
    12521257            '''
    1253             import wx.lib.scrolledpanel as wxscroll
    12541258            self.cifdefs.DestroyChildren()
    12551259            self.cifdefs.SetTitle('Edit CIF settings')
     
    12891293                but.phasedict = self.Phases[phasenam]  # set a pointer to current phase info     
    12901294                but.Bind(wx.EVT_BUTTON,EditRanges)     # phase bond/angle ranges
     1295                but = wx.Button(cpnl, wx.ID_ANY,'Set distance/angle publication flags')
     1296                but.phase = phasenam  # set a pointer to current phase info     
     1297                but.Bind(wx.EVT_BUTTON,SelectDisAglFlags)     # phase bond/angle ranges
     1298                cbox.Add((-1,2))
     1299                cbox.Add(but,0,wx.ALIGN_LEFT,0)
    12911300            for i in sorted(self.powderDict.keys()):
    12921301                G2gd.HorizontalLine(cbox,cpnl)         
     
    13011310                                      histblk["Sample Parameters"]['InstrName']),
    13021311                    0,wx.EXPAND|wx.ALIGN_LEFT|wx.ALL)
    1303                 cpnl.SetSizer(cbox)
    13041312            for i in sorted(self.xtalDict.keys()):
    13051313                G2gd.HorizontalLine(cbox,cpnl)         
     
    13141322                                      histblk["Instrument Parameters"][0]['InstrName']),
    13151323                    0,wx.EXPAND|wx.ALIGN_LEFT|wx.ALL)
    1316                 cpnl.SetSizer(cbox)
    1317 
     1324            cpnl.SetSizer(cbox)
    13181325            cpnl.SetAutoLayout(1)
    13191326            cpnl.SetupScrolling()
     
    13331340            vbox.Fit(self.cifdefs)
    13341341            self.cifdefs.Layout()
    1335 
     1342           
     1343        def OnToggleButton(event):
     1344            'Respond to press of ToggleButton in SelectDisAglFlags'
     1345            but = event.GetEventObject()
     1346            if but.GetValue():                   
     1347                but.DisAglSel[but.key] = True
     1348            else:
     1349                try:
     1350                    del but.DisAglSel[but.key]
     1351                except KeyError:
     1352                    pass
     1353        def keepTrue(event):
     1354            event.GetEventObject().SetValue(True)
     1355        def keepFalse(event):
     1356            event.GetEventObject().SetValue(False)
     1357               
     1358        def SelectDisAglFlags(event):
     1359            'Select Distance/Angle use flags for the selected phase'
     1360            phasenam = event.GetEventObject().phase
     1361            phasedict = self.Phases[phasenam]
     1362            SymOpList,offsetList,symOpList,G2oprList = G2spc.AllOps(phasedict['General']['SGData'])
     1363            generalData = phasedict['General']
     1364            # create a dict for storing Pub flag for bonds/angles, if needed
     1365            if phasedict['General'].get("DisAglHideFlag") is None:
     1366                phasedict['General']["DisAglHideFlag"] = {}
     1367            DisAngSel = phasedict['General']["DisAglHideFlag"]
     1368
     1369            cx,ct,cs,cia = phasedict['General']['AtomPtrs']
     1370            cn = ct-1
     1371            cfrac = cx+3
     1372            DisAglData = {}
     1373            DisAglCtls = {}
     1374            # create a list of atoms, but skip atoms with zero occupancy
     1375            xyz = []
     1376            fpfx = str(phasedict['pId'])+'::Afrac:'       
     1377            for i,atom in enumerate(phasedict['Atoms']):
     1378                if self.parmDict.get(fpfx+str(i),atom[cfrac]) == 0.0: continue
     1379                xyz.append([i,]+atom[cn:cn+2]+atom[cx:cx+3])
     1380            if 'DisAglCtls' in generalData:
     1381                DisAglCtls = generalData['DisAglCtls']
     1382            else: # should not happen, since DisAglDialog should be called for all
     1383                # phases before getting here
     1384                dlg = G2gd.DisAglDialog(self.cifdefs,DisAglCtls,generalData)
     1385                if dlg.ShowModal() == wx.ID_OK:
     1386                    DisAglCtls = dlg.GetData()
     1387                    generalData['DisAglCtls'] = DisAglCtls
     1388                else:
     1389                    dlg.Destroy()
     1390                    return
     1391                dlg.Destroy()
     1392            dlg = wx.Dialog(
     1393                self.G2frame,
     1394                style=wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER)
     1395            vbox = wx.BoxSizer(wx.VERTICAL)
     1396            txt = wx.StaticText(dlg,wx.ID_ANY,'Searching distances for phase '+phasenam
     1397                                +'\nPlease wait...')
     1398            vbox.Add(txt,0,wx.ALL|wx.EXPAND)
     1399            dlg.SetSizer(vbox)
     1400            dlg.CenterOnParent()
     1401            dlg.Show() # post "please wait"
     1402            wx.BeginBusyCursor() # and change cursor
     1403
     1404            DisAglData['OrigAtoms'] = xyz
     1405            DisAglData['TargAtoms'] = xyz
     1406            SymOpList,offsetList,symOpList,G2oprList = G2spc.AllOps(
     1407                generalData['SGData'])
     1408
     1409            xpandSGdata = generalData['SGData'].copy()
     1410            xpandSGdata.update({'SGOps':symOpList,
     1411                                'SGInv':False,
     1412                                'SGLatt':'P',
     1413                                'SGCen':np.array([[0, 0, 0]]),})
     1414            DisAglData['SGData'] = xpandSGdata
     1415
     1416            DisAglData['Cell'] = generalData['Cell'][1:] #+ volume
     1417            if 'pId' in phasedict:
     1418                DisAglData['pId'] = phasedict['pId']
     1419                DisAglData['covData'] = self.OverallParms['Covariance']
     1420            try:
     1421                AtomLabels,DistArray,AngArray = G2stMn.RetDistAngle(DisAglCtls,DisAglData)
     1422            except KeyError:        # inside DistAngle for missing atom types in DisAglCtls
     1423                print('**** ERROR - try again but do "Reset" to fill in missing atom types ****')
     1424            wx.EndBusyCursor()
     1425            txt.SetLabel('Set publication flags for distances and angles in\nphase '+phasenam)
     1426            vbox.Add((5,5))
     1427            vbox.Add(wx.StaticText(dlg,wx.ID_ANY,
     1428                                   'The default is to flag all distances and angles as to be'+
     1429                                   '\npublished. Change this by pressing appropriate buttons.'),
     1430                     0,wx.ALL|wx.EXPAND)
     1431            hbox = wx.BoxSizer(wx.HORIZONTAL)
     1432            vbox.Add(hbox)
     1433            hbox.Add(wx.StaticText(dlg,wx.ID_ANY,'Button appearance: '))
     1434            but = wx.ToggleButton(dlg,wx.ID_ANY,'Publish')
     1435            but.Bind(wx.EVT_TOGGLEBUTTON,keepFalse)
     1436            hbox.Add(but)
     1437            but = wx.ToggleButton(dlg,wx.ID_ANY,"Don't publish")
     1438            but.Bind(wx.EVT_TOGGLEBUTTON,keepTrue)
     1439            hbox.Add(but)
     1440            but.SetValue(True)
     1441            G2gd.HorizontalLine(vbox,dlg)         
     1442           
     1443            cpnl = wxscroll.ScrolledPanel(dlg,size=(400,300))
     1444            cbox = wx.BoxSizer(wx.VERTICAL)
     1445            for c in sorted(DistArray):
     1446                karr = []
     1447                UsedCols = {}
     1448                cbox.Add(wx.StaticText(cpnl,wx.ID_ANY,
     1449                                   'distances to/angles around atom '+AtomLabels[c]))
     1450                #dbox = wx.GridBagSizer(hgap=5)
     1451                dbox = wx.GridBagSizer()
     1452                for i,D in enumerate(DistArray[c]):
     1453                    karr.append(tuple(D[0:3]))
     1454                    val = "{:.2f}".format(D[3])
     1455                    sym = " [{:d} {:d} {:d}]".format(*D[1]) + " #{:d}".format(D[2])
     1456                    dbox.Add(wx.StaticText(cpnl,wx.ID_ANY,AtomLabels[D[0]]),
     1457                             (i+1,0)
     1458                             )                   
     1459                    dbox.Add(wx.StaticText(cpnl,wx.ID_ANY,sym),
     1460                             (i+1,1)
     1461                             )
     1462                    but = wx.ToggleButton(cpnl,wx.ID_ANY,val)
     1463                    but.key = (c,karr[-1])
     1464                    but.DisAglSel = DisAngSel
     1465                    if DisAngSel.get(but.key): but.SetValue(True)
     1466                    but.Bind(wx.EVT_TOGGLEBUTTON,OnToggleButton)
     1467                    dbox.Add(but,(i+1,2),border=1)
     1468                for i,D in enumerate(AngArray[c]):
     1469                    val = "{:.1f}".format(D[2][0])
     1470                    but = wx.ToggleButton(cpnl,wx.ID_ANY,val)
     1471                    but.key = (karr[D[0]],c,karr[D[1]])
     1472                    but.DisAglSel = DisAngSel
     1473                    if DisAngSel.get(but.key): but.SetValue(True)
     1474                    but.Bind(wx.EVT_TOGGLEBUTTON,OnToggleButton)
     1475                    dbox.Add(but,(D[0]+1,D[1]+3),border=1)
     1476                    UsedCols[D[1]+3] = True
     1477                for i,D in enumerate(DistArray[c][:-1]): # label columns that are used
     1478                    if UsedCols.get(i+3):
     1479                        dbox.Add(wx.StaticText(cpnl,wx.ID_ANY,AtomLabels[D[0]]),
     1480                                 (0,i+3),
     1481                                 flag=wx.ALIGN_CENTER
     1482                                 )
     1483                dbox.Add(wx.StaticText(cpnl,wx.ID_ANY,'distance'),
     1484                                 (0,2),
     1485                                 flag=wx.ALIGN_CENTER
     1486                                 )
     1487                cbox.Add(dbox)
     1488                G2gd.HorizontalLine(cbox,cpnl)         
     1489            cpnl.SetSizer(cbox)
     1490            cpnl.SetAutoLayout(1)
     1491            cpnl.SetupScrolling()
     1492            #cpnl.Bind(rw.EVT_RW_LAYOUT_NEEDED, self.OnLayoutNeeded) # needed if sizes change
     1493            cpnl.Layout()
     1494
     1495            vbox.Add(cpnl, 1, wx.ALIGN_LEFT|wx.ALL|wx.EXPAND, 0)
     1496
     1497            btnsizer = wx.StdDialogButtonSizer()
     1498            btn = wx.Button(dlg, wx.ID_OK, "Done")
     1499            btn.SetDefault()
     1500            btnsizer.AddButton(btn)
     1501            btnsizer.Realize()
     1502            vbox.Add(btnsizer, 0, wx.ALIGN_CENTER|wx.ALL, 5)
     1503            dlg.SetSizer(vbox)
     1504            vbox.Fit(dlg)
     1505            dlg.Layout()
     1506           
     1507            dlg.CenterOnParent()
     1508            dlg.ShowModal()
     1509           
    13361510# ===== end of functions for export method =======================================
    13371511#=================================================================================
     
    13811555        self.quickmode = False
    13821556        phasenam = phasenum = None # include all phases
    1383         if mode != "full" or len(self.powderDict) + len(self.xtalDict) == 0:
     1557        if self.mode != "full" or len(self.powderDict) + len(self.xtalDict) == 0:
    13841558            self.quickmode = True
    13851559            oneblock = True
     
    14691643        if not self.quickmode: # give the user a chance to edit all defaults
    14701644            self.cifdefs = wx.Dialog(
    1471                 self.G2frame,style=wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER)
     1645                self.G2frame,
     1646                style=wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER)
    14721647            EditCIFDefaults()
     1648            self.cifdefs.CenterOnParent()
    14731649            val = self.cifdefs.ShowModal()
    14741650            self.cifdefs.Destroy()
     
    15221698        # Start writing the CIF - multiblock
    15231699        #======================================================================
    1524             # publication info
    1525             WriteCIFitem('\ndata_'+self.CIFname+'_publ')
    1526             WriteAudit()
    1527             WriteCIFitem('_pd_block_id',
    1528                          str(self.CIFdate) + "|" + str(self.CIFname) + "|" +
    1529                          str(self.shortauthorname) + "|Overall")
    1530             writeCIFtemplate(self.OverallParms['Controls'],'publ') #insert the publication template
    1531             # ``template_publ.cif`` or a modified version
    1532             # overall info
    1533             WriteCIFitem('data_'+str(self.CIFname)+'_overall')
    1534             WriteOverall()
    1535             #============================================================
    1536             WriteCIFitem('# POINTERS TO PHASE AND HISTOGRAM BLOCKS')
    1537             datablockidDict = {} # save block names here -- N.B. check for conflicts between phase & hist names (unlikely!)
    1538             # loop over phase blocks
    1539             if len(self.Phases) > 1:
    1540                 loopprefix = ''
    1541                 WriteCIFitem('loop_   _pd_phase_block_id')
    1542             else:
    1543                 loopprefix = '_pd_phase_block_id'
    1544            
    1545             for phasenam in sorted(self.Phases.keys()):
    1546                 i = self.Phases[phasenam]['pId']
    1547                 datablockidDict[phasenam] = (str(self.CIFdate) + "|" + str(self.CIFname) + "|" +
    1548                              'phase_'+ str(i) + '|' + str(self.shortauthorname))
    1549                 WriteCIFitem(loopprefix,datablockidDict[phasenam])
    1550             # loop over data blocks
    1551             if len(self.powderDict) + len(self.xtalDict) > 1:
    1552                 loopprefix = ''
    1553                 WriteCIFitem('loop_   _pd_block_diffractogram_id')
    1554             else:
    1555                 loopprefix = '_pd_block_diffractogram_id'
    1556             for i in sorted(self.powderDict.keys()):
    1557                 hist = self.powderDict[i]
    1558                 histblk = self.Histograms[hist]
    1559                 instnam = histblk["Sample Parameters"]['InstrName']
    1560                 instnam = instnam.replace(' ','')
    1561                 i = histblk['hId']
    1562                 datablockidDict[hist] = (str(self.CIFdate) + "|" + str(self.CIFname) + "|" +
    1563                                          str(self.shortauthorname) + "|" +
    1564                                          instnam + "_hist_"+str(i))
    1565                 WriteCIFitem(loopprefix,datablockidDict[hist])
    1566             for i in sorted(self.xtalDict.keys()):
    1567                 hist = self.xtalDict[i]
    1568                 histblk = self.Histograms[hist]
    1569                 instnam = histblk["Instrument Parameters"][0]['InstrName']
    1570                 instnam = instnam.replace(' ','')
    1571                 i = histblk['hId']
    1572                 datablockidDict[hist] = (str(self.CIFdate) + "|" + str(self.CIFname) + "|" +
    1573                                          str(self.shortauthorname) + "|" +
    1574                                          instnam + "_hist_"+str(i))
    1575                 WriteCIFitem(loopprefix,datablockidDict[hist])
    1576             #============================================================
    1577             # loop over phases, exporting them
    1578             phasebyhistDict = {} # create a cross-reference to phases by histogram
    1579             for j,phasenam in enumerate(sorted(self.Phases.keys())):
    1580                 i = self.Phases[phasenam]['pId']
    1581                 WriteCIFitem('\ndata_'+self.CIFname+"_phase_"+str(i))
    1582                 WriteCIFitem('# Information for phase '+str(i))
    1583                 WriteCIFitem('_pd_block_id',datablockidDict[phasenam])
    1584                 # report the phase
    1585                 writeCIFtemplate(self.Phases[phasenam]['General'],'phase',phasenam) # write phase template
    1586                 WritePhaseInfo(phasenam)
    1587                 # preferred orientation
    1588                 SH = FormatSH(phasenam)
    1589                 MD = FormatHAPpo(phasenam)
    1590                 if SH and MD:
    1591                     WriteCIFitem('_pd_proc_ls_pref_orient_corr', SH + '\n' + MD)
    1592                 elif SH or MD:
    1593                     WriteCIFitem('_pd_proc_ls_pref_orient_corr', SH + MD)
     1700            nsteps = 1 + len(self.Phases) + len(self.powderDict) + len(self.xtalDict)
     1701            try:
     1702                dlg = wx.ProgressDialog('CIF progress','starting',nsteps,parent=self.G2frame)
     1703                Size = dlg.GetSize()
     1704                Size = (int(Size[0]*3),Size[1]) # increase size along x
     1705                dlg.SetSize(Size)
     1706                dlg.CenterOnParent()
     1707
     1708                # publication info
     1709                step = 1
     1710                dlg.Update(step,"Exporting overall section")
     1711                WriteCIFitem('\ndata_'+self.CIFname+'_publ')
     1712                WriteAudit()
     1713                WriteCIFitem('_pd_block_id',
     1714                             str(self.CIFdate) + "|" + str(self.CIFname) + "|" +
     1715                             str(self.shortauthorname) + "|Overall")
     1716                writeCIFtemplate(self.OverallParms['Controls'],'publ') #insert the publication template
     1717                # ``template_publ.cif`` or a modified version
     1718                # overall info
     1719                WriteCIFitem('data_'+str(self.CIFname)+'_overall')
     1720                WriteOverall()
     1721                #============================================================
     1722                WriteCIFitem('# POINTERS TO PHASE AND HISTOGRAM BLOCKS')
     1723                datablockidDict = {} # save block names here -- N.B. check for conflicts between phase & hist names (unlikely!)
     1724                # loop over phase blocks
     1725                if len(self.Phases) > 1:
     1726                    loopprefix = ''
     1727                    WriteCIFitem('loop_   _pd_phase_block_id')
    15941728                else:
    1595                     WriteCIFitem('_pd_proc_ls_pref_orient_corr', 'none')
    1596                 # report sample profile terms
    1597                 PP = FormatPhaseProfile(phasenam)
    1598                 if PP:
    1599                     WriteCIFitem('_pd_proc_ls_profile_function',PP)
    1600                    
    1601             #============================================================
    1602             # loop over histograms, exporting them
    1603             for i in sorted(self.powderDict.keys()):
    1604                 hist = self.powderDict[i]
    1605                 histblk = self.Histograms[hist]
    1606                 if hist.startswith("PWDR"):
    1607                     WriteCIFitem('\ndata_'+self.CIFname+"_pwd_"+str(i))
    1608                     #instnam = histblk["Sample Parameters"]['InstrName']
    1609                     # report instrumental profile terms
    1610                     WriteCIFitem('_pd_proc_ls_profile_function',
    1611                         FormatInstProfile(histblk["Instrument Parameters"],histblk['hId']))
    1612                     WriteCIFitem('# Information for histogram '+str(i)+': '+hist)
    1613                     WriteCIFitem('_pd_block_id',datablockidDict[hist])
    1614                     histprm = self.Histograms[hist]["Sample Parameters"]
    1615                     writeCIFtemplate(histprm,'powder',histprm['InstrName']) # powder template
    1616                     WritePowderData(hist)
    1617             for i in sorted(self.xtalDict.keys()):
    1618                 hist = self.xtalDict[i]
    1619                 histblk = self.Histograms[hist]
    1620                 if hist.startswith("HKLF"):
    1621                     WriteCIFitem('\ndata_'+self.CIFname+"_sx_"+str(i))
    1622                     #instnam = histblk["Instrument Parameters"][0]['InstrName']
    1623                     WriteCIFitem('# Information for histogram '+str(i)+': '+hist)
    1624                     WriteCIFitem('_pd_block_id',datablockidDict[hist])
    1625                     histprm = self.Histograms[hist]["Instrument Parameters"][0]
    1626                     writeCIFtemplate(histprm,'single',histprm['InstrName']) # single crystal template
    1627                     WriteSingleXtalData(hist)
     1729                    loopprefix = '_pd_phase_block_id'
     1730
     1731                for phasenam in sorted(self.Phases.keys()):
     1732                    i = self.Phases[phasenam]['pId']
     1733                    datablockidDict[phasenam] = (str(self.CIFdate) + "|" + str(self.CIFname) + "|" +
     1734                                 'phase_'+ str(i) + '|' + str(self.shortauthorname))
     1735                    WriteCIFitem(loopprefix,datablockidDict[phasenam])
     1736                # loop over data blocks
     1737                if len(self.powderDict) + len(self.xtalDict) > 1:
     1738                    loopprefix = ''
     1739                    WriteCIFitem('loop_   _pd_block_diffractogram_id')
     1740                else:
     1741                    loopprefix = '_pd_block_diffractogram_id'
     1742                for i in sorted(self.powderDict.keys()):
     1743                    hist = self.powderDict[i]
     1744                    histblk = self.Histograms[hist]
     1745                    instnam = histblk["Sample Parameters"]['InstrName']
     1746                    instnam = instnam.replace(' ','')
     1747                    i = histblk['hId']
     1748                    datablockidDict[hist] = (str(self.CIFdate) + "|" + str(self.CIFname) + "|" +
     1749                                             str(self.shortauthorname) + "|" +
     1750                                             instnam + "_hist_"+str(i))
     1751                    WriteCIFitem(loopprefix,datablockidDict[hist])
     1752                for i in sorted(self.xtalDict.keys()):
     1753                    hist = self.xtalDict[i]
     1754                    histblk = self.Histograms[hist]
     1755                    instnam = histblk["Instrument Parameters"][0]['InstrName']
     1756                    instnam = instnam.replace(' ','')
     1757                    i = histblk['hId']
     1758                    datablockidDict[hist] = (str(self.CIFdate) + "|" + str(self.CIFname) + "|" +
     1759                                             str(self.shortauthorname) + "|" +
     1760                                             instnam + "_hist_"+str(i))
     1761                    WriteCIFitem(loopprefix,datablockidDict[hist])
     1762                #============================================================
     1763                # loop over phases, exporting them
     1764                phasebyhistDict = {} # create a cross-reference to phases by histogram
     1765                for j,phasenam in enumerate(sorted(self.Phases.keys())):
     1766                    step += 1
     1767                    dlg.Update(step,"Exporting phase "+phasenam+' (#'+str(j+1)+')')
     1768                    i = self.Phases[phasenam]['pId']
     1769                    WriteCIFitem('\ndata_'+self.CIFname+"_phase_"+str(i))
     1770                    WriteCIFitem('# Information for phase '+str(i))
     1771                    WriteCIFitem('_pd_block_id',datablockidDict[phasenam])
     1772                    # report the phase
     1773                    writeCIFtemplate(self.Phases[phasenam]['General'],'phase',phasenam) # write phase template
     1774                    WritePhaseInfo(phasenam)
     1775                    # preferred orientation
     1776                    SH = FormatSH(phasenam)
     1777                    MD = FormatHAPpo(phasenam)
     1778                    if SH and MD:
     1779                        WriteCIFitem('_pd_proc_ls_pref_orient_corr', SH + '\n' + MD)
     1780                    elif SH or MD:
     1781                        WriteCIFitem('_pd_proc_ls_pref_orient_corr', SH + MD)
     1782                    else:
     1783                        WriteCIFitem('_pd_proc_ls_pref_orient_corr', 'none')
     1784                    # report sample profile terms
     1785                    PP = FormatPhaseProfile(phasenam)
     1786                    if PP:
     1787                        WriteCIFitem('_pd_proc_ls_profile_function',PP)
     1788
     1789                #============================================================
     1790                # loop over histograms, exporting them
     1791                for i in sorted(self.powderDict.keys()):
     1792                    hist = self.powderDict[i]
     1793                    histblk = self.Histograms[hist]
     1794                    if hist.startswith("PWDR"):
     1795                        step += 1
     1796                        dlg.Update(step,"Exporting "+hist.strip())
     1797                        WriteCIFitem('\ndata_'+self.CIFname+"_pwd_"+str(i))
     1798                        #instnam = histblk["Sample Parameters"]['InstrName']
     1799                        # report instrumental profile terms
     1800                        WriteCIFitem('_pd_proc_ls_profile_function',
     1801                            FormatInstProfile(histblk["Instrument Parameters"],histblk['hId']))
     1802                        WriteCIFitem('# Information for histogram '+str(i)+': '+hist)
     1803                        WriteCIFitem('_pd_block_id',datablockidDict[hist])
     1804                        histprm = self.Histograms[hist]["Sample Parameters"]
     1805                        writeCIFtemplate(histprm,'powder',histprm['InstrName']) # powder template
     1806                        WritePowderData(hist)
     1807                for i in sorted(self.xtalDict.keys()):
     1808                    hist = self.xtalDict[i]
     1809                    histblk = self.Histograms[hist]
     1810                    if hist.startswith("HKLF"):
     1811                        step += 1
     1812                        dlg.Update(step,"Exporting "+hist.strip())
     1813                        WriteCIFitem('\ndata_'+self.CIFname+"_sx_"+str(i))
     1814                        #instnam = histblk["Instrument Parameters"][0]['InstrName']
     1815                        WriteCIFitem('# Information for histogram '+str(i)+': '+hist)
     1816                        WriteCIFitem('_pd_block_id',datablockidDict[hist])
     1817                        histprm = self.Histograms[hist]["Instrument Parameters"][0]
     1818                        writeCIFtemplate(histprm,'single',histprm['InstrName']) # single crystal template
     1819                        WriteSingleXtalData(hist)
     1820
     1821            except Exception:
     1822                import traceback
     1823                print(traceback.format_exc())
     1824                self.G2frame.ErrorDialog('Exception',
     1825                                         'Error occurred in CIF creation. '+
     1826                                         'See full error message in console output ')
     1827            finally:
     1828                dlg.Destroy()
    16281829
    16291830        WriteCIFitem('#--' + 15*'eof--' + '#')
    16301831        closeCIF()
    1631         print("...export complete")
    1632 # end of CIF export
     1832        print("...export completed")
     1833        # end of CIF export
     1834
     1835class ExportSimpleCIF(ExportCIF):
     1836    '''Used to create a simple CIF of at most one phase. Uses exact same code as
     1837    :class:`ExportCIF` except that `self.mode` is set to simple.
     1838
     1839    :param wx.Frame G2frame: reference to main GSAS-II frame
     1840    '''
     1841    def __init__(self,G2frame):
     1842        G2IO.ExportBaseclass.__init__(self,
     1843            G2frame=G2frame,
     1844            formatName = 'full CIF',
     1845            extension='.cif',
     1846            longFormatName = 'Export project as CIF'
     1847            )
     1848        self.author = ''
     1849        self.mode = 'simple'
     1850        self.exporttype = 'phase'
    16331851
    16341852#===============================================================================
     
    21972415            try:
    21982416                cf = G2IO.ReadCIF(fil)
    2199                 if len(cf.keys()) == 0: raise Exception,"No CIF data_ blocks found"
     2417                if len(cf.keys()) == 0:
     2418                    raise Exception,"No CIF data_ blocks found"
    22002419                if len(cf.keys()) != 1:
    22012420                    raise Exception, 'Error, CIF Template has more than one block: '+fil
Note: See TracChangeset for help on using the changeset viewer.