Changeset 1057 for trunk/exports


Ignore:
Timestamp:
Sep 17, 2013 4:22:51 PM (8 years ago)
Author:
toby
Message:

reorg UserCalibrants? into ImageCalibrants?; Add trim (whitespace) routine; fix InstName? bug in GetHistogramPhaseData?; rework ValidatedTxtCtrl? for CIF; ScrolledMultiEditor? now resets after Cancel; CIF export progress

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/exports/G2cif.py

    r1045 r1057  
    2525#reload(G2IO)
    2626import GSASIIgrid as G2gd
     27reload(G2gd)
    2728import GSASIIstrIO as G2stIO
    2829#reload(G2stIO)
     
    3637#reload(G2pg)
    3738import GSASIIstrMain as G2stMn
    38 reload(G2stMn)
     39#reload(G2stMn)
    3940
    4041DEBUG = False    #True to skip printing of reflection/powder profile lists
     
    6667        '''
    6768   
     69        # ===== define functions for export method =======================================
    6870        def openCIF(filnam):
    6971            if DEBUG:
     
    115117            #WriteCIFitem('_refine_diff_density_max',rhomax)    #these need to be defined for each phase!
    116118            #WriteCIFitem('_refine_diff_density_min',rhomin)
    117             WriteCIFitem('_computing_structure_refinement','GSAS-II (Toby & Von Dreele, 2013)')
     119            WriteCIFitem('_computing_structure_refinement','GSAS-II (Toby & Von Dreele, J. Appl. Cryst. 46, 544-549, 2013)')
    118120            try:
    119121                vars = str(len(self.OverallParms['Covariance']['varyList']))
     
    854856                slam2 = self.sigDict.get('Lam2',-0.00009)
    855857                # always assume Ka1 & Ka2 if two wavelengths are present
     858                WriteCIFitem('_diffrn_radiation_type','K\\a~1,2~')
    856859                WriteCIFitem('loop_' +
    857860                             '\n\t_diffrn_radiation_wavelength' +
    858861                             '\n\t_diffrn_radiation_wavelength_wt' +
    859                              '\n\t_diffrn_radiation_type' +
    860862                             '\n\t_diffrn_radiation_wavelength_id')
    861863                WriteCIFitem('  ' + PutInCol(G2mth.ValEsd(lam1,slam1),15)+
    862864                             PutInCol('1.0',15) +
    863                              PutInCol('K\\a~1~',10) +
    864865                             PutInCol('1',5))
    865866                WriteCIFitem('  ' + PutInCol(G2mth.ValEsd(lam2,slam2),15)+
    866867                             PutInCol(G2mth.ValEsd(ratio,sratio),15)+
    867                              PutInCol('K\\a~2~',10) +
    868868                             PutInCol('2',5))               
    869869            else:
     
    903903                            )
    904904                    WriteCIFitem('loop_' +
    905                                  '\n\t_pd_proc_ls_R_F_factor' +
    906                                  '\n\t_pd_proc_ls_R_Fsqd_factor')
     905                                 '\n\t_gsas_proc_phase_R_F_factor' +
     906                                 '\n\t_gsas_proc_phase_R_Fsqd_factor' +
     907                                 '\n\t_gsas_proc_phase_id' +
     908                                 '\n\t_gsas_proc_phase_block_id')
    907909                    for phasenam in phasebyhistDict.get(histlbl):
    908910                        pfx = str(self.Phases[phasenam]['pId'])+':'+str(hId)+':'
     
    910912                            '  '+
    911913                            '  '+G2mth.ValEsd(histblk[pfx+'Rf']/100.,-.00009) +
    912                             '  '+G2mth.ValEsd(histblk[pfx+'Rf^2']/100.,-.00009)
     914                            '  '+G2mth.ValEsd(histblk[pfx+'Rf^2']/100.,-.00009)+
     915                            '  '+str(self.Phases[phasenam]['pId'])+
     916                            '  '+datablockidDict[phasenam]
    913917                            )
    914918            else:
     919                # single phase in this histogram
    915920                pfx = '0:'+str(hId)+':'
    916                 WriteCIFitem('_pd_proc_ls_R_F_factor      ','%.5f'%(histblk[pfx+'Rf']/100.))
    917                 WriteCIFitem('_pd_proc_ls_R_Fsqd_factor   ','%.5f'%(histblk[pfx+'Rf^2']/100.))
     921                WriteCIFitem('_refine_ls_R_F_factor      ','%.5f'%(histblk[pfx+'Rf']/100.))
     922                WriteCIFitem('_refine_ls_R_Fsqd_factor   ','%.5f'%(histblk[pfx+'Rf^2']/100.))
    918923               
    919924            WriteCIFitem('_pd_proc_ls_prof_R_factor   ','%.5f'%(histblk['R']/100.))
    920925            WriteCIFitem('_pd_proc_ls_prof_wR_factor  ','%.5f'%(histblk['wR']/100.))
    921             WriteCIFitem('_pd_proc_ls_prof_R_B_factor ','%.5f'%(histblk['Rb']/100.))
    922             WriteCIFitem('_pd_proc_ls_prof_wR_B_factor','%.5f'%(histblk['wRb']/100.))
     926            WriteCIFitem('_gsas_proc_ls_prof_R_B_factor ','%.5f'%(histblk['Rb']/100.))
     927            WriteCIFitem('_gsas_proc_ls_prof_wR_B_factor','%.5f'%(histblk['wRb']/100.))
    923928            WriteCIFitem('_pd_proc_ls_prof_wR_expected','%.5f'%(histblk['wRmin']/100.))
    924929
     
    11451150            WriteCIFitem('_reflns_R_F_factor_obs   ','%.4f'%(histblk[pfx+'Rf']/100.))
    11461151            WriteCIFitem('_reflns_R_Fsqd_factor_obs','%.4f'%(histblk[pfx+'Rf^2']/100.))
    1147 
    1148         #============================================================
     1152        def EditAuthor(event=None):
     1153            'Edit the CIF author name'
     1154            dlg = G2gd.SingleStringDialog(self.G2frame,
     1155                                          'Get CIF Author',
     1156                                          'Provide CIF Author name (Last, First)',
     1157                                          value=self.author)
     1158            if not dlg.Show():
     1159                dlg.Destroy()
     1160                return False  # cancel was pressed
     1161            self.author = dlg.GetValue()
     1162            dlg.Destroy()
     1163            try:
     1164                self.OverallParms['Controls']["Author"] = self.author # save for future
     1165            except KeyError:
     1166                pass
     1167            return True
     1168        def EditInstNames(event=None,msg=''):
     1169            'Provide a dialog for editing instrument names'
     1170            dictlist = []
     1171            keylist = []
     1172            lbllist = []
     1173            for hist in self.Histograms:
     1174                if hist.startswith("PWDR"):
     1175                    key2 = "Sample Parameters"
     1176                    d = self.Histograms[hist][key2]
     1177                elif hist.startswith("HKLF"):
     1178                    key2 = "Instrument Parameters"
     1179                    d = self.Histograms[hist][key2][0]
     1180                   
     1181                lbllist.append(hist)
     1182                dictlist.append(d)
     1183                keylist.append('InstrName')
     1184                instrname = d.get('InstrName')
     1185                if instrname is None:
     1186                    d['InstrName'] = ''
     1187            return G2gd.CallScrolledMultiEditor(
     1188                self.G2frame,dictlist,keylist,
     1189                prelbl=range(1,len(dictlist)+1),
     1190                postlbl=lbllist,
     1191                title='Instrument names',
     1192                header="Edit instrument names. Note that a non-blank\nname is required for all histograms"+msg)
     1193        def EditCIFDefaults(parent):
     1194            import wx.lib.scrolledpanel as wxscroll
     1195            cfrm = wx.Dialog(parent,style=wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER)
     1196            cfrm.SetTitle('child')
     1197            vbox = wx.BoxSizer(wx.VERTICAL)
     1198            cpnl = wxscroll.ScrolledPanel(cfrm,size=(300,300))
     1199            cbox = wx.BoxSizer(wx.VERTICAL)
     1200            but = wx.Button(cpnl, wx.ID_ANY,'Edit CIF Author')
     1201            but.Bind(wx.EVT_BUTTON,EditAuthor)
     1202            cbox.Add(but,0,wx.ALIGN_CENTER,3)
     1203            but = wx.Button(cpnl, wx.ID_ANY,'Edit Instrument Name(s)')
     1204            but.Bind(wx.EVT_BUTTON,EditInstNames)
     1205            cbox.Add(but,0,wx.ALIGN_CENTER,3)
     1206
     1207            cpnl.SetSizer(cbox)
     1208            cpnl.SetAutoLayout(1)
     1209            cpnl.SetupScrolling()
     1210            #cpnl.Bind(rw.EVT_RW_LAYOUT_NEEDED, self.OnLayoutNeeded)
     1211            cpnl.Layout()
     1212
     1213            vbox.Add(cpnl, 1, wx.ALIGN_LEFT|wx.ALL|wx.EXPAND, 0)
     1214            btnsizer = wx.StdDialogButtonSizer()
     1215            btn = wx.Button(cfrm, wx.ID_OK, "Create CIF")
     1216            btn.SetDefault()
     1217            btnsizer.AddButton(btn)
     1218            btn = wx.Button(cfrm, wx.ID_CANCEL)
     1219            btnsizer.AddButton(btn)
     1220            btnsizer.Realize()
     1221            vbox.Add(btnsizer, 0, wx.ALIGN_CENTER|wx.ALL, 5)
     1222            cfrm.SetSizer(vbox)
     1223            vbox.Fit(cfrm)
     1224            if cfrm.ShowModal() == wx.ID_OK:
     1225                val = True
     1226            else:
     1227                val = False
     1228            cfrm.Destroy()
     1229            return val           
     1230
     1231        # ===== end of functions for export method =======================================
     1232        #=================================================================================
     1233
    11491234        # the export process starts here
    11501235        # load all of the tree into a set of dicts
     
    11711256                self.xtalDict[i] = hist
    11721257        # is there anything to export?
    1173         if len(self.Phases) + len(self.powderDict) + len(self.xtalDict) == 0:
    1174             self.G2frame.ErrorDialog(
    1175                 'Empty project',
    1176                 'No data or phases to include in CIF')
    1177             return
    1178         # is there a file name defined?
     1258        if len(self.Phases) == len(self.powderDict) == len(self.xtalDict) == 0:
     1259           self.G2frame.ErrorDialog(
     1260               'Empty project',
     1261               'Project does not contain interconnected data & phase(s)')
     1262           return
     1263        # get the project file name
    11791264        self.CIFname = os.path.splitext(
    11801265            os.path.split(self.G2frame.GSASprojectfile)[1]
    11811266            )[0]
    11821267        self.CIFname = self.CIFname.replace(' ','')
    1183         if not self.CIFname:
    1184             self.G2frame.ErrorDialog(
    1185                 'No GPX name',
    1186                 'Please save the project to provide a name')
    1187             return
     1268        if not self.CIFname: # none defined & needed, save as GPX to get one
     1269            self.G2frame.OnFileSaveas(None)
     1270            if not self.G2frame.GSASprojectfile: return
     1271            self.CIFname = os.path.splitext(
     1272                os.path.split(self.G2frame.GSASprojectfile)[1]
     1273                )[0]
     1274            self.CIFname = self.CIFname.replace(' ','')
    11881275        # test for quick CIF mode or no data
    11891276        self.quickmode = False
     
    12171304            pass
    12181305        while not (self.author or self.quickmode):
    1219             dlg = G2gd.SingleStringDialog(self.G2frame,'Get CIF Author','Provide CIF Author name (Last, First)')
    1220             if not dlg.Show(): return # cancel was pressed
    1221             self.author = dlg.GetValue()
    1222             dlg.Destroy()
    1223         try:
    1224             self.OverallParms['Controls']["Author"] = self.author # save for future
    1225         except KeyError:
    1226             pass
     1306            if not EditAuthor(): return
    12271307        self.shortauthorname = self.author.replace(',','').replace(' ','')[:20]
    12281308
    1229         # check the instrument name for every histogram
     1309        # check there is an instrument name for every histogram
    12301310        if not self.quickmode:
    1231             dictlist = []
    1232             keylist = []
    1233             lbllist = []
    12341311            invalid = 0
    12351312            key3 = 'InstrName'
     
    12401317                elif hist.startswith("HKLF"):
    12411318                    key2 = "Instrument Parameters"
    1242                     d = self.Histograms[hist][key2][0]
    1243                    
    1244                 lbllist.append(hist)
    1245                 dictlist.append(d)
    1246                 keylist.append(key3)
     1319                    d = self.Histograms[hist][key2][0]                   
    12471320                instrname = d.get(key3)
    12481321                if instrname is None:
     
    12581331                    "File/Copy option to duplicate the name"
    12591332                    )
    1260                 if not G2gd.CallScrolledMultiEditor(
    1261                     self.G2frame,dictlist,keylist,
    1262                     prelbl=range(1,len(dictlist)+1),
    1263                     postlbl=lbllist,
    1264                     title='Instrument names',
    1265                     header="Edit instrument names. Note that a non-blank\nname is required for all histograms"+msg,
    1266                     ): return
     1333                if not EditInstNames(msg=msg): return
     1334        # check for a distance-angle range search range for each phase
     1335        if not self.quickmode:
     1336            for phasenam in sorted(self.Phases.keys()):
     1337                i = self.Phases[phasenam]['pId']
     1338                phasedict = self.Phases[phasenam] # pointer to current phase info           
     1339                generalData = phasedict['General']
     1340                if 'DisAglCtls' not in generalData:
     1341                    dlg = G2gd.DisAglDialog(self.G2frame,{},generalData)
     1342                    if dlg.ShowModal() == wx.ID_OK:
     1343                        generalData['DisAglCtls'] = dlg.GetData()
     1344                    else:
     1345                        dlg.Destroy()
     1346                        return
     1347                    dlg.Destroy()
    12671348
    12681349        if oneblock and not self.quickmode:
    12691350            # select a dataset to use (there should only be one set in one block,
    1270             # but take whatever comes 1st
     1351            # but take whatever comes 1st)
    12711352            for hist in self.Histograms:
    12721353                histblk = self.Histograms[hist]
     
    12821363            fil = self.defSaveFile()
    12831364        if not fil: return
    1284         openCIF(fil)
     1365        if not self.quickmode: # give the user a chance to edit all defaults
     1366            if not EditCIFDefaults(self.G2frame): return
    12851367        #======================================================================
    12861368        # Start writing the CIF - single block
    12871369        #======================================================================
     1370        openCIF(fil)
    12881371        if oneblock:
    12891372            WriteCIFitem('data_'+self.CIFname)
Note: See TracChangeset for help on using the changeset viewer.