Changeset 1022 for trunk/exports


Ignore:
Timestamp:
Aug 7, 2013 11:57:15 PM (8 years ago)
Author:
toby
Message:

fix error on adding an atom to a new phase before Draw Options are initialized

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/exports/G2cif.py

    r1014 r1022  
    1818import os.path
    1919import numpy as np
     20import wx
    2021import GSASIIpath
    2122GSASIIpath.SetVersionNumber("$Revision: 1006 $")
     
    2728#import GSASIImapvars as G2mv
    2829import GSASIImath as G2mth
    29 reload(G2mth)
     30#reload(G2mth)
    3031import GSASIIlattice as G2lat
    3132import GSASIIspc as G2spc
    3233#reload(G2spc)
    33 
    34 DEBUG = True    #True to skip printing of reflection/powder profile lists
     34import GSASIIphsGUI as G2pg
     35#reload(G2pg)
     36import GSASIIstrMain as G2stMn
     37
     38DEBUG = False
     39#DEBUG = True    #True to skip printing of reflection/powder profile lists
    3540
    3641def getCallerDocString(): # for development
     
    4853            G2frame=G2frame,
    4954            formatName = 'full CIF',
    50             longFormatName = 'Export project as complete CIF'
     55            extension='.cif',
     56            longFormatName = 'Export project as CIF'
    5157            )
    5258        self.author = ''
     
    5965        '''
    6066   
     67        def openCIF(filnam):
     68            self.fp = open(filnam,'w')
     69
     70        def closeCIF():
     71            self.fp.close()
     72           
    6173        def WriteCIFitem(name,value=''):
    6274            if value:
    6375                if "\n" in value or len(value)> 70:
    64                     if name.strip(): print name
    65                     print '; '+value
    66                     print '; '
     76                    if name.strip(): self.fp.write(name+'\n')
     77                    self.fp.write('; '+value+'\n')
     78                    self.fp.write('; '+'\n')
    6779                elif " " in value:
    6880                    if len(name)+len(value) > 65:
    69                         print name,'\n   ','"' + str(value) + '"'
     81                        self.fp.write(name + '\n   ' + '"' + str(value) + '"'+'\n')
    7082                    else:
    71                         print name,'  ','"' + str(value) + '"'
     83                        self.fp.write(name + '  ' + '"' + str(value) + '"'+'\n')
    7284                else:
    7385                    if len(name)+len(value) > 65:
    74                         print name,'\n   ',value
     86                        self.fp.write(name+'\n   ' + value+'\n')
    7587                    else:
    76                         print name,'  ',value
     88                        self.fp.write(name+'  ' + value+'\n')
    7789            else:
    78                 print name
     90                self.fp.write(name+'\n')
    7991
    8092        def WriteAudit():
     
    237249           
    238250            TODO: this needs to be expanded to show the diffuse peak and
    239             Debye term information as well.
     251            Debye term information as well. (Bob)
    240252
    241253            :returns: the text description (str)
     
    625637            phasedict = self.Phases[phasenam] # pointer to current phase info           
    626638            Atoms = phasedict['Atoms']
     639            generalData = phasedict['General']
    627640            cx,ct,cs,cia = phasedict['General']['AtomPtrs']
     641            cn = ct-1
    628642            fpfx = str(phasedict['pId'])+'::Afrac:'       
    629643            cfrac = cx+3
     644            DisAglData = {}
     645            DisAglCtls = {}
     646            xyz = []
     647            for i,atom in enumerate(Atoms):
     648                xyz.append([i,]+atom[cn:cn+2]+atom[cx:cx+3])
     649            if 'DisAglCtls' in generalData:
     650                DisAglCtls = generalData['DisAglCtls']
     651            else:
     652                dlg = G2gd.DisAglDialog(self.G2frame,DisAglCtls,generalData)
     653                if dlg.ShowModal() == wx.ID_OK:
     654                    DisAglCtls = dlg.GetData()
     655                    generalData['DisAglCtls'] = DisAglCtls
     656                else:
     657                    dlg.Destroy()
     658                    return
     659                dlg.Destroy()
     660            DisAglData['OrigAtoms'] = xyz
     661            DisAglData['TargAtoms'] = xyz
     662            DisAglData['SGData'] = generalData['SGData']
     663            SymOpList,offsetList,symOpList,G2oprList = G2spc.AllOps(
     664                generalData['SGData'])
     665
     666#            print len(SymOpList),len(offsetList),len(symOpList),len(G2oprList)
     667#            raise Exception
     668
     669           
     670            DisAglData['Cell'] = generalData['Cell'][1:] #+ volume
     671            if 'pId' in phasedict:
     672                DisAglData['pId'] = phasedict['pId']
     673                DisAglData['covData'] = self.OverallParms['Covariance']
     674            try:
     675                G2stMn.DistAngle(DisAglCtls,DisAglData)
     676            except KeyError:        # inside DistAngle for missing atom types in DisAglCtls
     677                print '**** ERROR - try again but do "Reset" to fill in missing atom types ****'
     678                   
     679
     680            raise Exception
     681       
    630682            # loop over interatomic distances for this phase
    631683            WriteCIFitem('\n# MOLECULAR GEOMETRY')
     
    729781            if not self.quickmode:      # report distances and angles
    730782                WriteDistances(phasenam,SymOpList,offsetList,symOpList,G2oprList)
     783               
     784        def Yfmt(ndec,val):
     785            'Format intensity values'
     786            out = ("{:."+str(ndec)+"f}").format(val)
     787            out = out.rstrip('0')  # strip zeros to right of decimal
     788            return out.rstrip('.')  # and decimal place when not needed
    731789
    732790        def WritePowderData(histlbl):
    733             text = '?'
    734791            histblk = self.Histograms[histlbl]
    735792            inst = histblk['Instrument Parameters'][0]
    736793            hId = histblk['hId']
    737794            pfx = ':' + str(hId) + ':'
    738             print 'TODO: powder here data for',histblk["Sample Parameters"]['InstrName']
    739             # see wrpowdhist.for & wrreflist.for
    740795           
    741796            if 'Lam1' in inst:
     
    833888            WriteCIFitem('_pd_proc_ls_background_function',FormatBackground(histblk['Background'],histblk['hId']))
    834889
     890            # TODO: this will need help from Bob
    835891            #WriteCIFitem('_exptl_absorpt_process_details','?')
    836892            #WriteCIFitem('_exptl_absorpt_correction_T_min','?')
     
    863919                         '\n\t' + refprx + 'index_k' +
    864920                         '\n\t' + refprx + 'index_l' +
    865 #                         '\n\t_pd_refln_wavelength_id' +
    866 #                         '\n\t' + refprx + 'status' +
    867921                         '\n\t' + refprx + 'F_squared_meas' +
    868 #                         '\n\t' + refprx + 'F_squared_sigma' +
    869922                         '\n\t' + refprx + 'F_squared_calc' +
    870923                         '\n\t' + refprx + 'phase_calc' +
     
    938991                if zerolst: zero = zerolst[1]
    939992                zero = self.parmDict.get('Zero',zero)
    940                 # TODO: Bob is zero added or subtracted?
    941993                if zero:
    942994                    WriteCIFitem('_pd_proc_2theta_range_min', G2mth.ValEsd(histblk['Data'][0][0]-zero,-0.00009))
     
    9551007                else:
    9561008                    WriteCIFitem('\t_pd_meas_2theta_scan')
    957             # at least for now, always report weights. TODO: Should they be multiplied by weights?
     1009            # at least for now, always report weights.
    9581010            #if countsdata:
    9591011            #    WriteCIFitem('\t_pd_meas_counts_total')
     
    9631015            WriteCIFitem('\t_pd_proc_intensity_bkg_calc')
    9641016            WriteCIFitem('\t_pd_proc_ls_weight')
    965             # TODO: are data excluded?
     1017            maxY = max(histblk['Data'][1].max(),histblk['Data'][3].max())
     1018            if maxY < 0: maxY *= -10 # this should never happen, but...
     1019            ndec = max(0,10-int(np.log10(maxY))-1) # 10 sig figs should be enough
     1020            maxSU = histblk['Data'][2].max()
     1021            if maxSU < 0: maxSU *= -1 # this should never happen, but...
     1022            ndecSU = max(0,8-int(np.log10(maxSU))-1) # 8 sig figs should be enough
     1023            lowlim,highlim = histblk['Limits'][1]
     1024
    9661025            for x,yobs,yw,ycalc,ybkg in zip(histblk['Data'][0],
    9671026                                            histblk['Data'][1],
     
    9691028                                            histblk['Data'][3],
    9701029                                            histblk['Data'][4]):
    971                 if DEBUG:
    972                     print 'DEBUG: skip reflection list'
    973                     break
     1030                if lowlim <= x <= highlim:
     1031                    pass
     1032                else:
     1033                    yw = 0.0 # show the point is not in use
     1034
    9741035                if fixedstep:
    9751036                    s = ""
    9761037                else:
    9771038                    s = PutInCol(G2mth.ValEsd(x-zero,-0.00009),10)
    978                 s += PutInCol(G2mth.ValEsd(yobs,-0.00009),14)
    979                 s += PutInCol(G2mth.ValEsd(ycalc,-0.00009),14)
    980                 s += PutInCol(G2mth.ValEsd(ybkg,-0.00009),14)
    981                 s += PutInCol(G2mth.ValEsd(yw,-0.000009),14)
     1039                s += PutInCol(Yfmt(ndec,yobs),12)
     1040                s += PutInCol(Yfmt(ndec,ycalc),12)
     1041                s += PutInCol(Yfmt(ndec,ybkg),11)
     1042                s += PutInCol(Yfmt(ndecSU,yw),9)
    9821043                WriteCIFitem("  "+s)
    983                          
     1044
    9841045        def WriteSingleXtalData(histlbl):
    9851046            histblk = self.Histograms[histlbl]
    986             print 'TODO: single xtal here data for',histblk["Instrument Parameters"][0]['InstrName']
    987 
    9881047            #refprx = '_refln.' # mm
    9891048            refprx = '_refln_' # normal
    9901049
    991             print histblk.keys()
    992            
    9931050            WriteCIFitem('\n# STRUCTURE FACTOR TABLE')           
    9941051            WriteCIFitem('loop_' +
     
    10401097        #============================================================
    10411098        # the export process starts here
    1042         # also load all of the tree into a set of dicts
     1099        # load all of the tree into a set of dicts
    10431100        self.loadTree()
    1044         #self.dumpTree()
    10451101        # create a dict with refined values and their uncertainties
    10461102        self.loadParmDict()
    1047         #
    1048 
    1049         # get restraint info
     1103
     1104        # Someday: get restraint & constraint info
    10501105        #restraintDict = self.OverallParms.get('Restraints',{})
    10511106        #for i in  self.OverallParms['Constraints']:
     
    10531108        #    for j in self.OverallParms['Constraints'][i]:
    10541109        #        print j
    1055         #return
    10561110
    10571111        self.CIFdate = dt.datetime.strftime(dt.datetime.now(),"%Y-%m-%dT%H:%M")
    1058         # count phases, powder and single crystal histograms
    1059         self.nphase = len(self.Phases)
     1112        # index powder and single crystal histograms
    10601113        self.powderDict = {}
    10611114        self.xtalDict = {}
     
    10671120                self.xtalDict[i] = hist
    10681121        # is there anything to export?
    1069         if self.nphase + len(self.powderDict) + len(self.xtalDict) == 0:
     1122        if len(self.Phases) + len(self.powderDict) + len(self.xtalDict) == 0:
    10701123            self.G2frame.ErrorDialog(
    10711124                'Empty project',
     
    10881141            self.quickmode = True
    10891142            oneblock = True
    1090             if self.nphase == 0:
     1143            if len(self.Phases) == 0:
    10911144                self.G2frame.ErrorDialog(
    10921145                    'No phase present',
    10931146                    'Cannot create a coordinates CIF with no phases')
    10941147                return
    1095             elif self.nphase > 1: # quick mode: choose one phase
     1148            elif len(self.Phases) > 1: # quick mode: choose one phase
    10961149                choices = sorted(self.Phases.keys())
    10971150                phasenum = G2gd.ItemSelector(choices,self.G2frame)
     
    10991152                phasenam = choices[phasenum]
    11001153        # will this require a multiblock CIF?
    1101         elif self.nphase > 1:
     1154        elif len(self.Phases) > 1:
    11021155            oneblock = False
    11031156        elif len(self.powderDict) + len(self.xtalDict) > 1:
     
    11731226                    instnam = histblk["Instrument Parameters"][0]['InstrName']
    11741227                    break # ignore all but 1st data histogram
     1228        if self.quickmode:
     1229            fil = self.askSaveFile()
     1230        else:
     1231            fil = self.defSaveFile()
     1232        if not fil: return
     1233        openCIF(fil)
    11751234        #======================================================================
    11761235        # Start writing the CIF - single block
     
    12301289            datablockidDict = {} # save block names here -- N.B. check for conflicts between phase & hist names (unlikely!)
    12311290            # loop over phase blocks
    1232             if self.nphase > 1:
     1291            if len(self.Phases) > 1:
    12331292                loopprefix = ''
    12341293                WriteCIFitem('loop_   _pd_phase_block_id')
     
    13201379
    13211380        WriteCIFitem('#--' + 15*'eof--' + '#')
    1322 
     1381        closeCIF()
Note: See TracChangeset for help on using the changeset viewer.