Ignore:
Timestamp:
Jun 21, 2021 5:58:24 PM (6 months ago)
Author:
toby
Message:

finish hist/phase tree entry; create new help file for it(incomplete)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/GSASIIddataGUI.py

    r4965 r4968  
    1818'''
    1919from __future__ import division, print_function
     20import copy
    2021import wx
    2122import numpy as np
     
    3940                'rho':[],'rhoMax':0.,'mapSize':10.0,'cutOff':50.,'Flip':False}
    4041
    41 ##### DData routines ################################################################################       
    4242def UpdateDData(G2frame,DData,data,hist='',Scroll=0):
    4343    '''Display the Diffraction Data associated with a phase
    4444    (items where there is a value for each histogram and phase)
     45    Used in the Phase/Data tab or the Hist/Phase tree entry
    4546
    4647    :param wx.frame G2frame: the main GSAS-II frame object
     
    11091110
    11101111def MakeHistPhaseWin(G2frame):
    1111     '''Display Phase/Data info from Hist/Phase tree item
     1112    '''Display Phase/Data info from Hist/Phase tree item (not used with Phase/Data tab)
    11121113    '''
    11131114    TabSelectionIdDict = {}
     
    11221123            if tabname == phaseList[i]:
    11231124                HAPBook.SetSelection(i)
    1124                 FillDDataWindow(i) # may result in a double paint on some OSs
     1125                wx.CallAfter(FillDDataWindow,i) # may result in a double paint on some OSs
    11251126                return
    11261127        else:
     
    11301131        'respond to a notebook tab'
    11311132        page = event.GetSelection()
    1132         FillDDataWindow(page)
     1133        wx.CallAfter(FillDDataWindow,page)
     1134
     1135    def getDDataWindow():
     1136        'Get the current scrollwindow for selected phase'
     1137        return DData[HAPBook.GetSelection()]
     1138   
     1139    def getDDataPhaseinfo():
     1140        'Get the data tree entry for the currently selected phase'
     1141        page = HAPBook.GetSelection()
     1142        return G2frame.GPXtree.GetItemPyData(phaseIds[page])
    11331143       
    11341144    def FillDDataWindow(page):
     
    11381148        G2plt.PlotSizeStrainPO(G2frame,data,hist='',Start=True)           
    11391149        UpdateDData(G2frame,DData[page],data)
    1140 
     1150       
     1151    #### G2frame.dataWindow.DataMenu/"Edit Phase" menu routines (note similar routines in GSASIIphsGUI.py)
     1152    def OnHklfAdd(event):
     1153        data = getDDataPhaseinfo()
     1154        keyList = data['Histograms'].keys()
     1155        TextList = []
     1156        if not G2frame.GPXtree.GetCount():
     1157            return
     1158       
     1159        item, cookie = G2frame.GPXtree.GetFirstChild(G2frame.root)
     1160        while item:
     1161            name = G2frame.GPXtree.GetItemText(item)
     1162            if name not in keyList and 'HKLF' in name:
     1163                TextList.append(name)
     1164            item, cookie = G2frame.GPXtree.GetNextChild(G2frame.root, cookie)                       
     1165            if not TextList:
     1166                G2G.G2MessageBox(G2frame,'No reflections')
     1167                return
     1168        dlg = G2G.G2MultiChoiceDialog(G2frame, 'Select reflection sets to use',
     1169            'Use data',TextList)
     1170        try:
     1171            if dlg.ShowModal() == wx.ID_OK:
     1172                result = dlg.GetSelections()
     1173            else:
     1174                return
     1175        finally:
     1176            dlg.Destroy()
     1177
     1178        # get the histograms used in other phases
     1179        phaseRIdList,usedHistograms = G2frame.GetPhaseInfofromTree()
     1180        usedHKLFhists = [] # used single-crystal histograms
     1181        for p in usedHistograms:
     1182            for h in usedHistograms[p]:
     1183                if h.startswith('HKLF ') and h not in usedHKLFhists:
     1184                    usedHKLFhists.append(h)
     1185        # check that selected single crystal histograms are not already in use!
     1186        for i in result:
     1187            used = [TextList[i] for i in result if TextList[i] in usedHKLFhists]
     1188            if used:
     1189                msg = 'The following single crystal histogram(s) are already in use'
     1190                for i in used:
     1191                    msg += '\n  '+str(i)
     1192                msg += '\nAre you sure you want to add them to this phase? '
     1193                msg += 'Associating a single crystal dataset to >1 histogram is usually an error, '
     1194                msg += 'so No is suggested here.'
     1195                if G2frame.ErrorDialog('Likely error',msg,G2frame,wtype=wx.YES_NO) != wx.ID_YES: return
     1196
     1197        wx.BeginBusyCursor()
     1198        for i in result:
     1199            histoName = TextList[i]
     1200            Id = G2gd.GetGPXtreeItemId(G2frame,G2frame.root,histoName)
     1201            refDict,reflData = G2frame.GPXtree.GetItemPyData(Id)
     1202            data['Histograms'][histoName] = {'Histogram':histoName,'Show':False,'Scale':[1.0,True],
     1203                'Babinet':{'BabA':[0.0,False],'BabU':[0.0,False]},
     1204                'Extinction':['Lorentzian','None',
     1205                {'Tbar':0.1,'Cos2TM':0.955,'Eg':[1.e-7,False],'Es':[1.e-7,False],'Ep':[1.e-7,False]},],
     1206                'Flack':[0.0,False],'Twins':[[np.array([[1,0,0],[0,1,0],[0,0,1]]),[1.0,False,0]],]}                       
     1207            if 'TwMax' in reflData:     #nonmerohedral twins present
     1208                data['Histograms'][histoName]['Twins'] = []
     1209                for iT in range(reflData['TwMax'][0]+1):
     1210                    if iT in reflData['TwMax'][1]:
     1211                        data['Histograms'][histoName]['Twins'].append([False,0.0])
     1212                    else:
     1213                        data['Histograms'][histoName]['Twins'].append([np.array([[1,0,0],[0,1,0],[0,0,1]]),[1.0,False,reflData['TwMax'][0]]])
     1214            else:   #no nonmerohedral twins
     1215                data['Histograms'][histoName]['Twins'] = [[np.array([[1,0,0],[0,1,0],[0,0,1]]),[1.0,False,0]],]
     1216            UpdateHKLFdata(histoName)
     1217        wx.CallAfter(UpdateDData,G2frame,getDDataWindow(),data)
     1218        wx.EndBusyCursor()
     1219       
     1220    def OnDataUse(event):
     1221        data = getDDataPhaseinfo()
     1222#        hist = G2frame.hist
     1223        if data['Histograms']:
     1224            dlg = G2G.G2MultiChoiceDialog(G2frame, 'Use histograms',
     1225                'Use which histograms?',G2frame.dataWindow.HistsInPhase)
     1226            try:
     1227                if dlg.ShowModal() == wx.ID_OK:
     1228                    sel = dlg.GetSelections()
     1229                    for Id,item in enumerate(G2frame.dataWindow.HistsInPhase):
     1230                        if Id in sel:
     1231                            data['Histograms'][item]['Use'] = True
     1232                        else:
     1233                            data['Histograms'][item]['Use'] = False                       
     1234            finally:
     1235                dlg.Destroy()
     1236        wx.CallAfter(UpdateDData,G2frame,getDDataWindow(),data)
     1237
     1238    def UpdateHKLFdata(histoName):
     1239        data = getDDataPhaseinfo()
     1240        generalData = data['General']
     1241        Id = G2gd.GetGPXtreeItemId(G2frame,G2frame.root,histoName)
     1242        refDict,reflData = G2frame.GPXtree.GetItemPyData(Id)
     1243        SGData = generalData['SGData']
     1244        Cell = generalData['Cell'][1:7]
     1245        G,g = G2lat.cell2Gmat(Cell)
     1246        for iref,ref in enumerate(reflData['RefList']):
     1247            H = list(ref[:3])
     1248            ref[4] = np.sqrt(1./G2lat.calc_rDsq2(H,G))
     1249            iabsnt,ref[3],Uniq,phi = G2spc.GenHKLf(H,SGData)
     1250       
     1251    def OnDataCopy(event):
     1252        data = getDDataPhaseinfo()
     1253        hist = G2frame.hist
     1254        keyList = G2frame.dataWindow.HistsInPhase[:]
     1255        if hist in keyList: keyList.remove(hist)
     1256        if not keyList:
     1257            G2G.G2MessageBox(G2frame,'No histograms to copy to')
     1258            return
     1259        sourceDict = copy.deepcopy(data['Histograms'][hist])
     1260        if 'HKLF' in sourceDict['Histogram']:
     1261            copyNames = ['Extinction','Babinet','Flack','Twins']
     1262        else:  #PWDR 
     1263            copyNames = ['Pref.Ori.','Size','Mustrain','HStrain','Extinction','Babinet','LeBail','newLeBail','Layer Disp']
     1264        copyNames += ['Scale','Fix FXU','FixedSeqVars']
     1265        copyDict = {}
     1266        for name in copyNames:
     1267            if name not in sourceDict: continue
     1268            copyDict[name] = copy.deepcopy(sourceDict[name])        #force copy
     1269        dlg = G2G.G2MultiChoiceDialog(G2frame,u'Copy phase/histogram parameters\nfrom '+hist[5:][:35],
     1270                'Copy phase/hist parameters', keyList)
     1271        try:
     1272            if dlg.ShowModal() == wx.ID_OK:
     1273                for sel in dlg.GetSelections():
     1274                    data['Histograms'][keyList[sel]].update(copy.deepcopy(copyDict))
     1275        finally:
     1276            dlg.Destroy()
     1277       
     1278    def OnDataCopyFlags(event):
     1279        data = getDDataPhaseinfo()
     1280        hist = G2frame.hist
     1281        sourceDict = copy.deepcopy(data['Histograms'][hist])
     1282        copyDict = {}
     1283        if 'HKLF' in sourceDict['Histogram']:
     1284            copyNames = ['Extinction','Babinet','Flack','Twins']
     1285        else:  #PWDR 
     1286            copyNames = ['Pref.Ori.','Size','Mustrain','HStrain','Extinction','Babinet','Layer Disp']
     1287        copyNames += ['Scale','Fix FXU','FixedSeqVars']
     1288        babNames = ['BabA','BabU']
     1289        for name in copyNames:
     1290            if name not in sourceDict: continue
     1291            if name in ['Scale','Extinction','HStrain','Flack','Twins','Layer Disp']:
     1292                if name == 'Extinction' and 'HKLF' in sourceDict['Histogram']:
     1293                    copyDict[name] = {name:[sourceDict[name][:2]]}
     1294                    for item in ['Eg','Es','Ep']:
     1295                        copyDict[name][item] = sourceDict[name][2][item][1]
     1296                elif name == 'Twins':
     1297                    copyDict[name] = sourceDict[name][0][1][1]
     1298                else:
     1299                    copyDict[name] = sourceDict[name][1]
     1300            elif name in ['Size','Mustrain']:
     1301                copyDict[name] = [sourceDict[name][0],sourceDict[name][2],sourceDict[name][5]]
     1302            elif name == 'Pref.Ori.':
     1303                copyDict[name] = [sourceDict[name][0],sourceDict[name][2]]
     1304                if sourceDict[name][0] == 'SH':
     1305                    SHterms = sourceDict[name][5]
     1306                    SHflags = {}
     1307                    for item in SHterms:
     1308                        SHflags[item] = SHterms[item]
     1309                    copyDict[name].append(SHflags)
     1310            elif name == 'Babinet':
     1311                copyDict[name] = {}
     1312                for bab in babNames:
     1313                    copyDict[name][bab] = sourceDict[name][bab][1]
     1314            elif name == 'Fix FXU' or name == 'FixedSeqVars':
     1315                copyDict[name] = copy.deepcopy(sourceDict[name])                   
     1316        keyList = G2frame.dataWindow.HistsInPhase[:]
     1317        if hist in keyList: keyList.remove(hist)
     1318        if not keyList:
     1319            G2G.G2MessageBox(G2frame,'No histograms to copy to')
     1320            return
     1321        dlg = G2G.G2MultiChoiceDialog(G2frame,u'Copy phase/histogram flags\nfrom '+hist[5:][:35],
     1322                'Copy phase/hist flags', keyList)
     1323        try:
     1324            if dlg.ShowModal() == wx.ID_OK:
     1325                for sel in dlg.GetSelections():
     1326                    item = keyList[sel]
     1327                    for name in copyNames:
     1328                        if name not in sourceDict: continue
     1329                        if name in ['Scale','Extinction','HStrain','Flack','Twins','Layer Disp']:
     1330                            if name == 'Extinction' and 'HKLF' in sourceDict['Histogram']:
     1331                                data['Histograms'][item][name][:2] = copy.deepcopy(sourceDict[name][:2])
     1332                                for itm in ['Eg','Es','Ep']:
     1333                                    data['Histograms'][item][name][2][itm][1] = copy.deepcopy(copyDict[name][itm])
     1334                            elif name == 'Twins':
     1335                                data['Histograms'][item]['Twins'][0][1][1] = copy.deepcopy(copyDict['Twins'])
     1336                            else:
     1337                                try:
     1338                                    data['Histograms'][item][name][1] = copy.deepcopy(copyDict[name])
     1339                                except KeyError:
     1340                                    continue
     1341                        elif name in ['Size','Mustrain']:
     1342                            data['Histograms'][item][name][0] = copy.deepcopy(copyDict[name][0])
     1343                            data['Histograms'][item][name][2] = copy.deepcopy(copyDict[name][1])
     1344                            data['Histograms'][item][name][5] = copy.deepcopy(copyDict[name][2])
     1345                        elif name == 'Pref.Ori.':
     1346                            data['Histograms'][item][name][0] = copy.deepcopy(copyDict[name][0])
     1347                            data['Histograms'][item][name][2] = copy.deepcopy(copyDict[name][1])
     1348                            if sourceDict[name][0] == 'SH':
     1349                               SHflags = copy.deepcopy(copyDict[name][2])
     1350                               SHterms = copy.deepcopy(sourceDict[name][5])
     1351                               data['Histograms'][item][name][6] = copy.deepcopy(sourceDict[name][6])
     1352                               data['Histograms'][item][name][7] = copy.deepcopy(sourceDict[name][7])
     1353                        elif name == 'Babinet':
     1354                            for bab in babNames:
     1355                                data['Histograms'][item][name][bab][1] = copy.deepcopy(copyDict[name][bab])
     1356                        elif name == 'Fix FXU' or name == 'FixedSeqVars':
     1357                            data['Histograms'][item][name] = copy.deepcopy(sourceDict[name])                     
     1358        finally:
     1359            dlg.Destroy()
     1360       
     1361    def OnSelDataCopy(event):
     1362        data = getDDataPhaseinfo()
     1363        hist = G2frame.hist
     1364        sourceDict = data['Histograms'][hist]
     1365        keyList = G2frame.dataWindow.HistsInPhase[:]
     1366        if hist in keyList: keyList.remove(hist)
     1367        if not keyList:
     1368            G2G.G2MessageBox(G2frame,'No histograms to copy to')
     1369            return
     1370        if 'HKLF' in sourceDict['Histogram']:
     1371            copyNames = ['Extinction','Babinet','Flack','Twins']
     1372        else:  #PWDR 
     1373            copyNames = ['Pref.Ori.','Size','Mustrain','HStrain','Extinction','Babinet','LeBail','newLeBail','Layer Disp']
     1374        copyNames += ['Scale','Fix FXU','FixedSeqVars']           
     1375        dlg = G2G.G2MultiChoiceDialog(G2frame,'Select which parameters to copy',
     1376            'Select phase data parameters', copyNames)
     1377        selectedItems = []
     1378        try:
     1379            if dlg.ShowModal() == wx.ID_OK:
     1380                selectedItems = [copyNames[i] for i in dlg.GetSelections()]
     1381        finally:
     1382            dlg.Destroy()
     1383        if not selectedItems: return # nothing to copy
     1384        copyDict = {}
     1385        for parm in selectedItems:
     1386            if parm not in sourceDict: continue
     1387            copyDict[parm] = copy.deepcopy(sourceDict[parm])
     1388        dlg = G2G.G2MultiChoiceDialog(G2frame,u'Copy selected phase/histogram parameters\nfrom '+hist[5:][:35],
     1389            'Copy selected phase/hist parameters', keyList)
     1390        try:
     1391            if dlg.ShowModal() == wx.ID_OK:
     1392                for sel in dlg.GetSelections():
     1393                    data['Histograms'][keyList[sel]].update(copy.deepcopy(copyDict))
     1394        finally:
     1395            dlg.Destroy()           
     1396       
     1397    def OnPwdrAdd(event):
     1398        data = getDDataPhaseinfo()
     1399        generalData = data['General']
     1400        SGData = generalData['SGData']
     1401        newList = []
     1402        NShkl = len(G2spc.MustrainNames(SGData))
     1403        NDij = len(G2spc.HStrainNames(SGData))
     1404        keyList = data['Histograms'].keys()
     1405        TextList = []
     1406        if G2frame.GPXtree.GetCount():
     1407            item, cookie = G2frame.GPXtree.GetFirstChild(G2frame.root)
     1408            while item:
     1409                name = G2frame.GPXtree.GetItemText(item)
     1410                if name not in keyList and 'PWDR' in name:
     1411                    TextList.append(name)
     1412                item, cookie = G2frame.GPXtree.GetNextChild(G2frame.root, cookie)
     1413            if not TextList:
     1414                G2G.G2MessageBox(G2frame,'No histograms')
     1415                return
     1416            dlg = G2G.G2MultiChoiceDialog(G2frame, 'Select powder histograms to use',
     1417                'Use data',TextList)
     1418            try:
     1419                if dlg.ShowModal() == wx.ID_OK:
     1420                    result = dlg.GetSelections()
     1421                    for i in result: newList.append(TextList[i])
     1422                    if 'All PWDR' in newList:
     1423                        newList = TextList[1:]
     1424                    for histoName in newList:
     1425                        Id = G2gd.GetGPXtreeItemId(G2frame,G2frame.root,histoName)
     1426                        data['Histograms'][histoName] = {'Histogram':histoName,'Show':False,'LeBail':False,'newLeBail':True,
     1427                            'Scale':[1.0,False],'Pref.Ori.':['MD',1.0,False,[0,0,1],0,{},['',],0.1],
     1428                            'Size':['isotropic',[1.,1.,1.],[False,False,False],[0,0,1],
     1429                                [1.,1.,1.,0.,0.,0.],6*[False,]],
     1430                            'Mustrain':['isotropic',[1000.0,1000.0,1.0],[False,False,False],[0,0,1],
     1431                                NShkl*[0.01,],NShkl*[False,]],
     1432                            'HStrain':[NDij*[0.0,],NDij*[False,]],
     1433                            'Layer Disp':[0.0,False],                         
     1434                            'Extinction':[0.0,False],'Babinet':{'BabA':[0.0,False],'BabU':[0.0,False]},'Fix FXU':' ','FixedSeqVars':[]}
     1435                        refList = G2frame.GPXtree.GetItemPyData(G2gd.GetGPXtreeItemId(G2frame,Id,'Reflection Lists'))
     1436                        refList[generalData['Name']] = {}                       
     1437                    wx.CallAfter(UpdateDData,G2frame,getDDataWindow(),data)
     1438            finally:
     1439                dlg.Destroy()
     1440               
     1441    def OnDataDelete(event):
     1442        data = getDDataPhaseinfo()
     1443        if G2frame.dataWindow.HistsInPhase:
     1444            DelList = []
     1445            extraOpts= {'label_0':'Remove from all phases','value_0':False}
     1446            h,pd = G2frame.GetUsedHistogramsAndPhasesfromTree()
     1447            if len(pd) > 1:
     1448                opts = extraOpts
     1449            else:
     1450                opts = {}
     1451            dlg = G2G.G2MultiChoiceDialog(G2frame,
     1452                'Select histogram(s) to remove   \nfrom this phase:',
     1453                'Remove histograms', G2frame.dataWindow.HistsInPhase,
     1454                extraOpts=opts)
     1455            try:
     1456                if dlg.ShowModal() == wx.ID_OK:
     1457                    DelList = [G2frame.dataWindow.HistsInPhase[i] for i in dlg.GetSelections()]
     1458            finally:
     1459                dlg.Destroy()
     1460            if extraOpts['value_0']:
     1461                for p in pd:
     1462                    for i in DelList:
     1463                        if i in pd[p]['Histograms']: del pd[p]['Histograms'][i]
     1464            else:
     1465                for i in DelList:
     1466                    del data['Histograms'][i]
     1467            wx.CallLater(100,UpdateDData,G2frame,getDDataWindow(),data)
     1468           
     1469    def OnDataApplyStrain(event):
     1470        data = getDDataPhaseinfo()
     1471        SGData = data['General']['SGData']       
     1472        DijVals = data['Histograms'][G2frame.hist]['HStrain'][0][:]
     1473        # apply the Dij values to the reciprocal cell
     1474        newA = []
     1475        Dijdict = dict(zip(G2spc.HStrainNames(SGData),DijVals))
     1476        for Aij,lbl in zip(G2lat.cell2A(data['General']['Cell'][1:7]),
     1477                            ['D11','D22','D33','D12','D13','D23']):
     1478            newA.append(Aij + Dijdict.get(lbl,0.0))
     1479        # convert back to direct cell
     1480        data['General']['Cell'][1:7] = G2lat.A2cell(newA)
     1481        data['General']['Cell'][7] = G2lat.calc_V(newA)
     1482        # subtract the selected histograms Dij values from all for this phase
     1483        for hist in data['Histograms']:
     1484            for i,val in enumerate(DijVals):
     1485                data['Histograms'][hist]['HStrain'][0][i] -= val
     1486        # for hist in sorted(data['Histograms']): # list effective lattice constants applying Dij values
     1487        #     DijVals = data['Histograms'][hist]['HStrain'][0]
     1488        #     newA = []
     1489        #     Dijdict = dict(zip(G2spc.HStrainNames(SGData),DijVals))
     1490        #     for Aij,lbl in zip(G2lat.cell2A(data['General']['Cell'][1:7]),
     1491        #                     ['D11','D22','D33','D12','D13','D23']):
     1492        #         newA.append(Aij + Dijdict.get(lbl,0.0))
     1493        #     print(hist, G2lat.A2cell(newA)[:3], G2lat.calc_V(newA))
     1494        wx.CallAfter(UpdateDData,G2frame,getDDataWindow(),data)
     1495       
    11411496    #### start of MakeHistPhaseWin
    11421497    G2frame.dataWindow.ClearData()
     
    11711526        TabSelectionIdDict[Id] = page
    11721527        G2frame.Bind(wx.EVT_MENU, OnSelectPage, id=Id)
     1528    # define commands in G2frame.dataWindow.DataMenu/"Edit Phase" menu
     1529    G2frame.Bind(wx.EVT_MENU, OnDataUse, id=G2G.wxID_DATAUSE)
     1530    G2frame.Bind(wx.EVT_MENU, OnDataCopy, id=G2G.wxID_DATACOPY)
     1531    G2frame.Bind(wx.EVT_MENU, OnDataCopyFlags, id=G2G.wxID_DATACOPYFLAGS)
     1532    G2frame.Bind(wx.EVT_MENU, OnSelDataCopy, id=G2G.wxID_DATASELCOPY)
     1533    G2frame.Bind(wx.EVT_MENU, OnPwdrAdd, id=G2G.wxID_PWDRADD)
     1534    G2frame.Bind(wx.EVT_MENU, OnHklfAdd, id=G2G.wxID_HKLFADD)
     1535    G2frame.Bind(wx.EVT_MENU, OnDataDelete, id=G2G.wxID_DATADELETE)
     1536    G2frame.Bind(wx.EVT_MENU, OnDataApplyStrain, id=G2G.wxID_DATADIJ)
    11731537    # display the last-selected phase or the 1st
    11741538    try:
     
    11801544    else:
    11811545        page = 0
    1182     # TODO: commands in G2frame.dataWindow.DataMenu/"Edit Phase" need to be reimplemented
    11831546    HAPBook.SetSelection(page)
    1184     FillDDataWindow(page)
    1185    
     1547    wx.CallAfter(FillDDataWindow,page)
Note: See TracChangeset for help on using the changeset viewer.