Source code for GSASII.GSASIIddataGUI

# -*- coding: utf-8 -*-
#GSASII - phase data display routines
'''Routines for Data tab in Phase dataframe follows.
'''
from __future__ import division, print_function
import copy
import numpy as np
import numpy.linalg as nl
from . import GSASIIpath
from . import GSASIIlattice as G2lat
from . import GSASIIspc as G2spc
from . import GSASIIplot as G2plt
from . import GSASIIpwd as G2pwd
from . import GSASIIphsGUI as G2phG
from . import GSASIIctrlGUI as G2G
from . import GSASIIdataGUI as G2gd
from . import GSASIIfiles as G2fil
from . import GSASIImath as G2mth

try:
    import wx
    WACV = wx.ALIGN_CENTER_VERTICAL
    #VERY_LIGHT_GREY = wx.Colour(235,235,235)
    #WHITE = wx.Colour(255,255,255)
    #BLACK = wx.Colour(0,0,0)
    VERY_LIGHT_GREY = wx.SystemSettings.GetColour(wx.SYS_COLOUR_BTNFACE)
    WHITE = wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOW)
    BLACK = wx.SystemSettings.GetColour(wx.SYS_COLOUR_BTNTEXT)
except:
    pass
#mapDefault = {'MapType':'','RefList':'','GridStep':0.25,'Show bonds':True,
#                'rho':[],'rhoMax':0.,'mapSize':10.0,'cutOff':50.,'Flip':False}
# not used?

[docs] def UpdateDData(G2frame,DData,data,hist='',Scroll=0): '''Display the Diffraction Data associated with a phase (items where there is a value for each histogram and phase) Used in the Phase/Data tab or the Hist/Phase tree entry :param wx.frame G2frame: the main GSAS-II frame object :param wx.ScrolledWindow DData: notebook page to be used for the display :param dict data: all the information on the phase in a dictionary :param str hist: histogram name :param int Scroll: previous scroll position ''' def PlotSizer(): def OnPlotSel(event): Obj = event.GetEventObject() generalData['Data plot type'] = Obj.GetStringSelection() G2plt.PlotSizeStrainPO(G2frame,data,G2frame.hist) wx.CallLater(100,UpdateDData,G2frame,DData,data,G2frame.hist) def OnPOhkl(event): event.Skip() Obj = event.GetEventObject() Saxis = Obj.GetValue().split() try: hkl = [int(Saxis[i]) for i in range(3)] except (ValueError,IndexError): hkl = generalData['POhkl'] if not np.any(np.array(hkl)): hkl = generalData['POhkl'] generalData['POhkl'] = hkl h,k,l = hkl Obj.SetValue('%3d %3d %3d'%(h,k,l)) G2plt.PlotSizeStrainPO(G2frame,data,G2frame.hist) def OnProj(event): Obj = event.GetEventObject() generalData['3Dproj'] = Obj.GetValue() G2plt.PlotSizeStrainPO(G2frame,data,G2frame.hist) ifkeV = 'E' in UseList[G2frame.hist].get('Type','') plotSizer = wx.BoxSizer(wx.VERTICAL) if ifkeV: choice = ['None','Mustrain','Size'] else: choice = ['None','Mustrain','Size','Preferred orientation','St. proj. Inv. pole figure','Eq. area Inv. pole figure'] plotSel = wx.RadioBox(DData,wx.ID_ANY,'Select plot type:',choices=choice, majorDimension=1,style=wx.RA_SPECIFY_COLS) plotSel.SetStringSelection(generalData['Data plot type']) plotSel.Bind(wx.EVT_RADIOBOX,OnPlotSel) plotSizer.Add(plotSel) if generalData['Data plot type'] == 'Preferred orientation': POhklSizer = wx.BoxSizer(wx.HORIZONTAL) POhklSizer.Add(wx.StaticText(DData,wx.ID_ANY,' Plot preferred orientation for H K L: '),0,WACV) h,k,l = generalData['POhkl'] poAxis = wx.TextCtrl(DData,wx.ID_ANY,'%3d %3d %3d'%(h,k,l),style=wx.TE_PROCESS_ENTER) poAxis.Bind(wx.EVT_TEXT_ENTER,OnPOhkl) poAxis.Bind(wx.EVT_KILL_FOCUS,OnPOhkl) POhklSizer.Add(poAxis,0,WACV) plotSizer.Add(POhklSizer) elif generalData['Data plot type'] in ['Mustrain','Size']: projSizer = wx.BoxSizer(wx.HORIZONTAL) projSizer.Add(wx.StaticText(DData,wx.ID_ANY,' Show projections for: '),0,WACV) proj = ['','x','y','z','xy','xz','yz','xyz'] projType = wx.ComboBox(DData,wx.ID_ANY,value=generalData['3Dproj'],choices=proj, style=wx.CB_READONLY|wx.CB_DROPDOWN) projType.Bind(wx.EVT_COMBOBOX, OnProj) projSizer.Add(projType,0,WACV) plotSizer.Add(projSizer) return plotSizer def ScaleSizer(): def OnScaleRef(event): Obj = event.GetEventObject() UseList[G2frame.hist]['Scale'][1] = Obj.GetValue() def onChangeFraction(invalid,value,tc): wx.CallLater(100,RepaintHistogramInfo,DData.GetScrollPos(wx.VERTICAL)) scaleSizer = wx.BoxSizer(wx.HORIZONTAL) if 'PWDR' in G2frame.hist: scaleRef = wx.CheckBox(DData,wx.ID_ANY,label=' Phase fraction: ') elif 'HKLF' in G2frame.hist: scaleRef = wx.CheckBox(DData,wx.ID_ANY,label=' Scale factor: ') scaleRef.SetValue(bool(UseList[G2frame.hist]['Scale'][1])) scaleRef.Bind(wx.EVT_CHECKBOX, OnScaleRef) scaleSizer.Add(scaleRef,0,WACV|wx.LEFT,5) scaleVal = G2G.ValidatedTxtCtrl(DData,UseList[G2frame.hist]['Scale'],0, xmin=0.,nDig=(10,4,'g'),typeHint=float,OnLeave=onChangeFraction) scaleSizer.Add(scaleVal,0,WACV) if 'PWDR' in G2frame.hist and generalData['Type'] != 'magnetic': wtSum = G2pwd.PhaseWtSum(G2frame,G2frame.hist) if wtSum and UseList[G2frame.hist]['Use']: weightFr = UseList[G2frame.hist]['Scale'][0]*generalData['Mass']/wtSum scaleSizer.Add(wx.StaticText(DData,label=' Wt. fraction: %.3f'%(weightFr)),0,WACV) return scaleSizer def OnLGmixRef(event): Obj = event.GetEventObject() hist,name = Indx[Obj.GetId()] UseList[G2frame.hist][name][2][2] = Obj.GetValue() def OnSizeType(event): Obj = event.GetEventObject() UseList[G2frame.hist]['Size'][0] = Obj.GetValue() G2plt.PlotSizeStrainPO(G2frame,data,G2frame.hist) wx.CallLater(100,RepaintHistogramInfo,DData.GetScrollPos(wx.VERTICAL)) def OnSizeRef(event): Obj = event.GetEventObject() hist,pid = Indx[Obj.GetId()] if UseList[G2frame.hist]['Size'][0] == 'ellipsoidal': UseList[G2frame.hist]['Size'][5][pid] = Obj.GetValue() else: UseList[G2frame.hist]['Size'][2][pid] = Obj.GetValue() def OnStrainType(event): Obj = event.GetEventObject() UseList[G2frame.hist]['Mustrain'][0] = Obj.GetValue() G2plt.PlotSizeStrainPO(G2frame,data,G2frame.hist) wx.CallLater(100,RepaintHistogramInfo,DData.GetScrollPos(wx.VERTICAL)) def OnStrainRef(event): Obj = event.GetEventObject() hist,pid = Indx[Obj.GetId()] if UseList[G2frame.hist]['Mustrain'][0] == 'generalized': UseList[G2frame.hist]['Mustrain'][5][pid] = Obj.GetValue() else: UseList[G2frame.hist]['Mustrain'][2][pid] = Obj.GetValue() def OnStrainAxis(event): event.Skip() Obj = event.GetEventObject() Saxis = Obj.GetValue().split() try: hkl = [int(Saxis[i]) for i in range(3)] except (ValueError,IndexError): hkl = UseList[G2frame.hist]['Mustrain'][3] if not np.any(np.array(hkl)): hkl = UseList[G2frame.hist]['Mustrain'][3] UseList[G2frame.hist]['Mustrain'][3] = hkl h,k,l = hkl Obj.SetValue('%3d %3d %3d'%(h,k,l)) wx.CallAfter(G2plt.PlotSizeStrainPO,G2frame,data,hist) def OnResetStrain(event): Obj = event.GetEventObject() item,name = Indx[Obj.GetId()] if name == 'isotropic': UseList[item]['Mustrain'][1][0] = 1000.0 elif name == 'uniaxial': UseList[item]['Mustrain'][1][0] = 1000.0 UseList[item]['Mustrain'][1][1] = 1000.0 elif name == 'generalized': muiso = 1000. cell = generalData['Cell'][1:7] vals = G2spc.Muiso2Shkl(muiso,SGData,cell) UseList[item]['Mustrain'][4] = vals G2plt.PlotSizeStrainPO(G2frame,data,item) wx.CallLater(100,RepaintHistogramInfo,DData.GetScrollPos(wx.VERTICAL)) def OnPOAxis(event): event.Skip() Obj = event.GetEventObject() Saxis = Obj.GetValue().split() try: hkl = [int(Saxis[i]) for i in range(3)] except (ValueError,IndexError): hkl = UseList[G2frame.hist]['Pref.Ori.'][3] if not np.any(np.array(hkl)): hkl = UseList[G2frame.hist]['Pref.Ori.'][3] UseList[G2frame.hist]['Pref.Ori.'][3] = hkl h,k,l = hkl Obj.SetValue('%3d %3d %3d'%(h,k,l)) def OnPOOrder(event): '''Respond when the SH order is changed in the GUI. Updates the dict with the cylindrical Spherical harmonics coefficients for the specified order, retaining values from the previous dict, if values were already present ''' Obj = event.GetEventObject() Order = int(Obj.GetValue()) UseList[G2frame.hist]['Pref.Ori.'][4] = Order UseList[G2frame.hist]['Pref.Ori.'][5] = SetPOCoef(Order) wx.CallLater(100,RepaintHistogramInfo,DData.GetScrollPos(wx.VERTICAL)) def OnPOType(event): '''Respond when the SH type is changed in the GUI. Note that values set that are not used are also not changed. ''' Obj = event.GetEventObject() if 'March' in Obj.GetValue(): UseList[G2frame.hist]['Pref.Ori.'][0] = 'MD' else: UseList[G2frame.hist]['Pref.Ori.'][0] = 'SH' wx.CallLater(100,RepaintHistogramInfo,DData.GetScrollPos(wx.VERTICAL)) def OnPORef(event): Obj = event.GetEventObject() UseList[G2frame.hist]['Pref.Ori.'][2] = Obj.GetValue() def OnAddFixed(event): fixedVars = UseList[G2frame.hist].get('FixedSeqVars',[]) SeqId = G2gd.GetGPXtreeItemId(G2frame, G2frame.root, 'Sequential results') seqData = G2frame.GPXtree.GetItemPyData(SeqId) if G2frame.hist not in seqData: print('Strange: '+G2frame.hist+' not found') return parmDict = seqData[G2frame.hist].get('parmDict',[]) # narrow down to items w/o a histogram & having float values phaseKeys = [i for i in parmDict if ':' in i and i.split(':')[1] == ''] phaseKeys = [i for i in phaseKeys if type(parmDict[i]) not in (int,str,bool)] if len(phaseKeys) == 0: return selected = [] for i,key in enumerate(phaseKeys): if key in fixedVars: selected.append(i) dlg = G2G.G2MultiChoiceDialog(G2frame, 'Choose phase vars to fix for this histogram only', 'Choose items to edit', phaseKeys,selected=selected) if dlg.ShowModal() == wx.ID_OK: sel = dlg.GetSelections() dlg.Destroy() else: dlg.Destroy() return UseList[G2frame.hist]['FixedSeqVars'] = [phaseKeys[i] for i in sel] wx.CallLater(100,RepaintHistogramInfo,DData.GetScrollPos(wx.VERTICAL)) def SetPOCoef(Order): '''Sets up a dict with the cylindrical Spherical harmonics coefficients for the specified order. Retains values from the previous dict, if values were already present ''' cofNames = G2lat.GenSHCoeffT(SGData['SGLaue'],'0',Order,False) #cylindrical & no M newPOCoef = dict(zip(cofNames,len(cofNames)*[0.])) POCoeff = UseList[G2frame.hist]['Pref.Ori.'][5] for cofName in POCoeff: if cofName in cofNames: newPOCoef[cofName] = POCoeff[cofName] return newPOCoef def checkAxis(axis): if not np.any(np.array(axis)): return False return axis def OnNewValue(invalid,value,tc): G2plt.PlotSizeStrainPO(G2frame,data,G2frame.hist) def OnNewValueReDraw(invalid,value,tc): G2plt.PlotSizeStrainPO(G2frame,data,G2frame.hist) wx.CallLater(100,RepaintHistogramInfo,DData.GetScrollPos(wx.VERTICAL)) def TopSizer(name,choices,parm,OnType): topSizer = wx.BoxSizer(wx.HORIZONTAL) topSizer.Add(wx.StaticText(DData,wx.ID_ANY,name),0,WACV) sizeType = wx.ComboBox(DData,wx.ID_ANY,value=UseList[G2frame.hist][parm][0],choices=choices, style=wx.CB_READONLY|wx.CB_DROPDOWN) sizeType.Bind(wx.EVT_COMBOBOX, OnType) topSizer.Add(sizeType,0,WACV|wx.BOTTOM,5) return topSizer def LGmixSizer(name,Limits,OnRef): lgmixSizer = wx.BoxSizer(wx.HORIZONTAL) lgmixRef = wx.CheckBox(DData,wx.ID_ANY,label='LGmix') lgmixRef.thisown = False lgmixRef.SetValue(UseList[G2frame.hist][name][2][2]) Indx[lgmixRef.GetId()] = [G2frame.hist,name] lgmixRef.Bind(wx.EVT_CHECKBOX, OnRef) lgmixSizer.Add(lgmixRef,0,WACV|wx.LEFT,5) lgmixVal = G2G.ValidatedTxtCtrl(DData,UseList[G2frame.hist][name][1],2, nDig=(10,3),xmin=Limits[0],xmax=Limits[1]) lgmixSizer.Add(lgmixVal,0,WACV|wx.LEFT,5) return lgmixSizer def ResetSizer(name,OnReset): resetSizer = wx.BoxSizer(wx.HORIZONTAL) reset = wx.Button(DData,wx.ID_ANY,label='Reset?') reset.thisown = False Indx[reset.GetId()] = [G2frame.hist,name] reset.Bind(wx.EVT_BUTTON,OnReset) resetSizer.Add(reset,0,WACV) return resetSizer def IsoSizer(name,parm,fmt,Limits,OnRef): isoSizer = wx.BoxSizer(wx.HORIZONTAL) sizeRef = wx.CheckBox(DData,wx.ID_ANY,label=name) sizeRef.thisown = False sizeRef.SetValue(UseList[G2frame.hist][parm][2][0]) Indx[sizeRef.GetId()] = [G2frame.hist,0] sizeRef.Bind(wx.EVT_CHECKBOX, OnRef) isoSizer.Add(sizeRef,0,WACV|wx.LEFT,5) sizeVal = G2G.ValidatedTxtCtrl(DData,UseList[G2frame.hist][parm][1],0, nDig=fmt,xmin=Limits[0],xmax=Limits[1],OnLeave=OnNewValue) isoSizer.Add(sizeVal,0,WACV) return isoSizer def UniSizer(parm,OnAxis): uniSizer = wx.BoxSizer(wx.HORIZONTAL) uniSizer.Add(wx.StaticText(DData,wx.ID_ANY,' Unique axis, H K L: '),0,WACV) h,k,l = UseList[G2frame.hist][parm][3] Axis = wx.TextCtrl(DData,wx.ID_ANY,'%3d %3d %3d'%(h,k,l),style=wx.TE_PROCESS_ENTER) Axis.Bind(wx.EVT_TEXT_ENTER,OnAxis) Axis.Bind(wx.EVT_KILL_FOCUS,OnAxis) uniSizer.Add(Axis,0,WACV|wx.LEFT,5) return uniSizer def UniDataSizer(parmName,parm,fmt,Limits,OnRef): dataSizer = wx.BoxSizer(wx.HORIZONTAL) parms = zip([' Equatorial '+parmName,' Axial '+parmName], UseList[G2frame.hist][parm][2],range(2)) for Pa,ref,Id in parms: sizeRef = wx.CheckBox(DData,wx.ID_ANY,label=Pa) sizeRef.thisown = False sizeRef.SetValue(ref) Indx[sizeRef.GetId()] = [G2frame.hist,Id] sizeRef.Bind(wx.EVT_CHECKBOX, OnRef) dataSizer.Add(sizeRef,0,WACV|wx.LEFT,5) sizeVal = G2G.ValidatedTxtCtrl(DData,UseList[G2frame.hist][parm][1], Id,fmt,xmin=Limits[0],xmax=Limits[1],OnLeave=OnNewValue) dataSizer.Add(sizeVal,0,WACV) return dataSizer def EllSizeDataSizer(): parms = zip(['S11','S22','S33','S12','S13','S23'],UseList[G2frame.hist]['Size'][4], UseList[G2frame.hist]['Size'][5],range(6)) dataSizer = wx.BoxSizer(wx.VERTICAL) matrixSizer = wx.FlexGridSizer(0,6,5,5) Sij = [] for Pa,val,ref,Id in parms: sizeRef = wx.CheckBox(DData,wx.ID_ANY,label=Pa) sizeRef.thisown = False sizeRef.SetValue(ref) Indx[sizeRef.GetId()] = [G2frame.hist,Id] sizeRef.Bind(wx.EVT_CHECKBOX, OnSizeRef) matrixSizer.Add(sizeRef,0,WACV) if Id < 3: sizeVal = G2G.ValidatedTxtCtrl(DData,UseList[G2frame.hist]['Size'][4], Id,nDig=(10,3),xmin=0.,xmax=4.,OnLeave=OnNewValueReDraw) else: sizeVal = G2G.ValidatedTxtCtrl(DData,UseList[G2frame.hist]['Size'][4], Id,nDig=(10,3),OnLeave=OnNewValueReDraw) # Create Sij matrix Sij += [val] matrixSizer.Add(sizeVal,0,WACV) dataSizer.Add(matrixSizer, 0) Esize,Rsize = nl.eigh(G2lat.U6toUij(np.asarray(Sij))) lengths = Esize G,g = G2lat.cell2Gmat(data['General']['Cell'][1:7]) #recip & real metric tensors GA,GB = G2lat.Gmat2AB(G) #Orthogonalization matricies hkls = [x/(sum(x**2)**0.5) for x in np.dot(Rsize, GA)] Ids = np.argsort(lengths) dataSizer.Add(wx.StaticText(DData,label=' Principal ellipsoid components:'),0) compSizer = wx.FlexGridSizer(3,3,5,5) Axes = [' Short Axis:',' Middle Axis:',' Long Axis:'] for Id in Ids: compSizer.Add(wx.StaticText(DData,label=Axes[Id]),0,WACV) compSizer.Add(wx.StaticText(DData,label='(%.3f, %.3f, %.3f) '%(hkls[Id][0], hkls[Id][1], hkls[Id][2])),0,WACV) compSizer.Add(wx.StaticText(DData,label='Length: %.3f'%lengths[Id]),0,WACV) dataSizer.Add(compSizer) return dataSizer def GenStrainDataSizer(): Snames = G2spc.MustrainNames(SGData) numb = len(Snames) onumb = len(UseList[G2frame.hist]['Mustrain'][4]) while onumb < numb: UseList[G2frame.hist]['Mustrain'][4].append(0.0) UseList[G2frame.hist]['Mustrain'][5].append(False) onumb += 1 muMean = G2spc.MuShklMean(SGData,Amat,UseList[G2frame.hist]['Mustrain'][4][:numb]) parms = zip(Snames,UseList[G2frame.hist]['Mustrain'][5],range(numb)) mainSizer = wx.BoxSizer(wx.VERTICAL) dataSizer = wx.FlexGridSizer(0,6,5,5) for Pa,ref,Id in parms: strainRef = wx.CheckBox(DData,wx.ID_ANY,label=Pa) strainRef.thisown = False strainRef.SetValue(ref) Indx[strainRef.GetId()] = [G2frame.hist,Id] strainRef.Bind(wx.EVT_CHECKBOX, OnStrainRef) dataSizer.Add(strainRef,0,WACV) strainVal = G2G.ValidatedTxtCtrl(DData,UseList[G2frame.hist]['Mustrain'][4], Id,nDig=(10,2),OnLeave=OnNewValueReDraw) dataSizer.Add(strainVal,0,WACV) mainSizer.Add(dataSizer) mainSizer.Add(wx.StaticText(DData,label=' Mean mustrain %.1f'%muMean) ,0,wx.ALIGN_CENTER_HORIZONTAL) return mainSizer def HstrainSizer(): def OnHstrainRef(event): Obj = event.GetEventObject() hist,pid = Indx[Obj.GetId()] UseList[G2frame.hist]['HStrain'][1][pid] = Obj.GetValue() hSizer = wx.BoxSizer(wx.VERTICAL) hstrainSizer = wx.FlexGridSizer(0,6,5,5) Hsnames = G2spc.HStrainNames(SGData) parms = zip(Hsnames,UseList[G2frame.hist]['HStrain'][1],range(len(Hsnames))) allzero = True for Pa,ref,Id in parms: hstrainRef = wx.CheckBox(DData,wx.ID_ANY,label=Pa) hstrainRef.thisown = False hstrainRef.SetValue(ref) Indx[hstrainRef.GetId()] = [G2frame.hist,Id] hstrainRef.Bind(wx.EVT_CHECKBOX, OnHstrainRef) hstrainSizer.Add(hstrainRef,0,WACV|wx.LEFT,5) hstrainVal = G2G.ValidatedTxtCtrl(DData, UseList[G2frame.hist]['HStrain'][0],Id,nDig=(10,3,'g'),OnLeave=OnNewValueReDraw) if abs(UseList[G2frame.hist]['HStrain'][0][Id]) > 1e-8: allzero = False hstrainSizer.Add(hstrainVal,0,WACV) hSizer.Add(hstrainSizer,0) if not allzero: # show Dij shifted unit cell DijVals = UseList[G2frame.hist]['HStrain'][0][:] A = G2lat.cell2A(data['General']['Cell'][1:7]) # apply the Dij values to the reciprocal cell newA = G2lat.AplusDij(A,DijVals,SGData) cell = G2lat.A2cell(newA) # convert back to direct cell laue = generalData['SGData']['SGLaue'] if laue == '2/m': laue += generalData['SGData']['SGUniq'] for cellGUI in G2fil.cellGUIlist: if laue in cellGUI[0]: useGUI = cellGUI break else: return hSizer cellstr = '' for txt,fmt,ifEdit,Id in zip(*useGUI[2:]): if cellstr: cellstr += ", " cellstr += txt+fmt.format(cell[Id]) cellstr += f', Vol = {G2lat.calc_V(newA):.3f}' den = G2mth.getDensity(data['General'],G2frame.hist,data)[0] cellstr += f', \u03C1 = {den:.3f}' hSizer.Add(wx.StaticText(DData,wx.ID_ANY,' '+cellstr),0) return hSizer def PoTopSizer(POData): poSizer = wx.FlexGridSizer(0,6,5,5) choice = ['March-Dollase','Spherical harmonics'] POtype = choice[['MD','SH'].index(POData[0])] poSizer.Add(wx.StaticText(DData,wx.ID_ANY,' Preferred orientation model '),0,WACV) POType = wx.ComboBox(DData,wx.ID_ANY,value=POtype,choices=choice, style=wx.CB_READONLY|wx.CB_DROPDOWN) POType.Bind(wx.EVT_COMBOBOX, OnPOType) poSizer.Add(POType) if POData[0] == 'SH': poSizer.Add(wx.StaticText(DData,wx.ID_ANY,' Harmonic order: '),0,WACV) poOrder = wx.ComboBox(DData,wx.ID_ANY,value=str(POData[4]),choices=[str(2*i) for i in range(18)], style=wx.CB_READONLY|wx.CB_DROPDOWN) poOrder.Bind(wx.EVT_COMBOBOX,OnPOOrder) poSizer.Add(poOrder,0,WACV) poRef = wx.CheckBox(DData,wx.ID_ANY,label=' Refine? ') poRef.SetValue(POData[2]) poRef.Bind(wx.EVT_CHECKBOX,OnPORef) poSizer.Add(poRef,0,WACV) return poSizer def MDDataSizer(POData): poSizer = wx.BoxSizer(wx.HORIZONTAL) poRef = wx.CheckBox(DData,wx.ID_ANY,label=' March-Dollase ratio: ') poRef.SetValue(POData[2]) poRef.Bind(wx.EVT_CHECKBOX,OnPORef) poSizer.Add(poRef,0,WACV|wx.LEFT,5) poVal = G2G.ValidatedTxtCtrl(DData,POData,1,nDig=(10,3),typeHint=float,xmin=0.) poSizer.Add(poVal,0,WACV) poSizer.Add(wx.StaticText(DData,wx.ID_ANY,' Unique axis, H K L: '),0,WACV) h,k,l = POData[3] poAxis = wx.TextCtrl(DData,wx.ID_ANY,'%3d %3d %3d'%(h,k,l),style=wx.TE_PROCESS_ENTER) poAxis.Bind(wx.EVT_TEXT_ENTER,OnPOAxis) poAxis.Bind(wx.EVT_KILL_FOCUS,OnPOAxis) poSizer.Add(poAxis,0,WACV) return poSizer def SHDataSizer(POData): ODFSizer = wx.FlexGridSizer(0,8,2,2) ODFkeys = list(POData[5].keys()) ODFkeys.sort() for odf in ODFkeys: ODFSizer.Add(wx.StaticText(DData,wx.ID_ANY,odf),0,WACV) ODFval = G2G.ValidatedTxtCtrl(DData,POData[5],odf,nDig=(8,3),typeHint=float,OnLeave=OnNewValue) ODFSizer.Add(ODFval,0,WACV|wx.LEFT,5) return ODFSizer def SHPenalty(POData): def OnHKLList(event): dlg = G2G.G2MultiChoiceDialog(G2frame, 'Select penalty hkls', 'Penalty hkls',hkls,filterBox=False) try: if dlg.ShowModal() == wx.ID_OK: POData[6] = [hkls[i].split(':')[0] for i in dlg.GetSelections()] if not POData[6]: POData[6] = ['',] else: return finally: dlg.Destroy() wx.CallLater(100,RepaintHistogramInfo,DData.GetScrollPos(wx.VERTICAL)) Id = G2gd.GetGPXtreeItemId(G2frame,G2frame.root,G2frame.hist) Inst = G2frame.GPXtree.GetItemPyData(G2gd.GetGPXtreeItemId(G2frame,Id, 'Instrument Parameters'))[0] reflSets = G2frame.GPXtree.GetItemPyData(G2gd.GetGPXtreeItemId(G2frame,Id,'Reflection Lists')) hkls = [] if generalData['Name'] in reflSets: reflData = reflSets[generalData['Name']] if 'RefList' in reflData: Super = generalData.get('Super',0) nprfo = 12 if 'T' in Inst['Type'][0] or 'B' in Inst['Type'][0]: nprfo = 14 for ref in reflData['RefList']: if ref[nprfo+Super] < 0.: hkls += ['%d %d %d: %.3f'%(ref[0],ref[1],ref[2],ref[nprfo+Super]),] if len(hkls) > 10: break shPenalty = wx.BoxSizer(wx.HORIZONTAL) shPenalty.Add(wx.StaticText(DData,wx.ID_ANY,' Negative MRD penalty list: '),0,WACV) shPenalty.Add(wx.ComboBox(DData,value=POData[6][0],choices=POData[6], style=wx.CB_DROPDOWN),0,WACV|wx.LEFT,5) hklList = wx.Button(DData,label='Select penalty hkls') hklList.Bind(wx.EVT_BUTTON,OnHKLList) shPenalty.Add(hklList,0,WACV) shPenalty.Add(wx.StaticText(DData,wx.ID_ANY,' Zero MRD tolerance: '),0,WACV) shToler = G2G.ValidatedTxtCtrl(DData,POData,7,nDig=(10,2),typeHint=float) shPenalty.Add(shToler,0,WACV) return shPenalty def ExtSizer(Type,Htype): def OnSCExtType(event): Obj = event.GetEventObject() item = Indx[Obj.GetId()] UseList[item[0]]['Extinction'][item[1]] = Obj.GetValue() wx.CallLater(100,RepaintHistogramInfo,DData.GetScrollPos(wx.VERTICAL)) def OnEref(event): Obj = event.GetEventObject() item = Indx[Obj.GetId()] UseList[item[0]]['Extinction'][2][item[1]][1] = Obj.GetValue() def OnExtRef(event): Obj = event.GetEventObject() UseList[G2frame.hist]['Extinction'][1] = Obj.GetValue() def ExtVal(Ekey,valSizer,fmt,lim): for ekey in Ekey: Eref = wx.CheckBox(DData,wx.ID_ANY,label=ekey+' : ') Eref.SetValue(UseList[G2frame.hist]['Extinction'][2][ekey][1]) Indx[Eref.GetId()] = [G2frame.hist,ekey] Eref.Bind(wx.EVT_CHECKBOX, OnEref) valSizer.Add(Eref,0,WACV|wx.LEFT,5) Eval = G2G.ValidatedTxtCtrl(DData,UseList[G2frame.hist]['Extinction'][2][ekey],0,xmax=lim[1], xmin=lim[0],nDig=(10,4,fmt),typeHint=float) valSizer.Add(Eval,0,WACV) return valSizer if Type == 'HKLF': extSizer = wx.BoxSizer(wx.VERTICAL) typeSizer = wx.BoxSizer(wx.HORIZONTAL) typeSizer.Add(wx.StaticText(DData,wx.ID_ANY,' Extinction type: '),0,WACV) Choices = ['None','Primary','Secondary Type I','Secondary Type II','microED'] # remove 'Secondary Type I & II' if Htype == 'SEC': Choices = ['None','microED'] typeTxt = wx.ComboBox(DData,wx.ID_ANY,choices=Choices,value=UseList[G2frame.hist]['Extinction'][1], style=wx.CB_READONLY|wx.CB_DROPDOWN) Indx[typeTxt.GetId()] = [G2frame.hist,1] typeTxt.Bind(wx.EVT_COMBOBOX,OnSCExtType) typeSizer.Add(typeTxt) if Htype != 'SEC': typeSizer.Add(wx.StaticText(DData,wx.ID_ANY,' Approx: '),0,WACV) Choices=['Lorentzian','Gaussian'] approxTxT = wx.ComboBox(DData,wx.ID_ANY,choices=Choices,value=UseList[G2frame.hist]['Extinction'][0], style=wx.CB_READONLY|wx.CB_DROPDOWN) Indx[approxTxT.GetId()] = [G2frame.hist,0] approxTxT.Bind(wx.EVT_COMBOBOX,OnSCExtType) typeSizer.Add(approxTxT) if UseList[G2frame.hist]['Extinction'][1] == 'None': extSizer.Add(typeSizer,0) elif UseList[G2frame.hist]['Extinction'][1] == 'microED': extSizer.Add(typeSizer,0) extSizer.Add(wx.StaticText(DData,label=' Small F microED dynamical scattering correction:')) val3Sizer =wx.BoxSizer(wx.HORIZONTAL) Ekey = ['Ma','Mb','Mc'] extSizer.Add(ExtVal(Ekey,val3Sizer,'g',[-1.,10.]),0,) else: extSizer.Add(typeSizer,0,wx.BOTTOM,5) if 'Tbar' in UseList[G2frame.hist]['Extinction'][2]: #skipped for TOF valSizer =wx.BoxSizer(wx.HORIZONTAL) valSizer.Add(wx.StaticText(DData,wx.ID_ANY,' Tbar(mm):'),0,WACV) tbarVal = G2G.ValidatedTxtCtrl(DData,UseList[G2frame.hist]['Extinction'][2],'Tbar', xmin=0.,nDig=(10,6),typeHint=float) valSizer.Add(tbarVal,0,WACV) valSizer.Add(wx.StaticText(DData,wx.ID_ANY,' cos(2ThM):'),0,WACV) cos2tm = G2G.ValidatedTxtCtrl(DData,UseList[G2frame.hist]['Extinction'][2],'Cos2TM', xmin=0.,xmax=1.,nDig=(10,3),typeHint=float) valSizer.Add(cos2tm,0,WACV) extSizer.Add(valSizer,0) val2Sizer =wx.BoxSizer(wx.HORIZONTAL) if 'Primary' in UseList[G2frame.hist]['Extinction'][1]: Ekey = ['Ep',] elif 'Secondary Type II' == UseList[G2frame.hist]['Extinction'][1]: Ekey = ['Es',] elif 'Secondary Type I' == UseList[G2frame.hist]['Extinction'][1]: Ekey = ['Eg',] else: Ekey = ['Eg','Es'] extSizer.Add(ExtVal(Ekey,val2Sizer,'g',[0.,100.]),0) else: #PWDR extSizer = wx.BoxSizer(wx.HORIZONTAL) extRef = wx.CheckBox(DData,wx.ID_ANY,label=' Extinction: ') extRef.SetValue(UseList[G2frame.hist]['Extinction'][1]) extRef.Bind(wx.EVT_CHECKBOX, OnExtRef) extSizer.Add(extRef,0,WACV|wx.LEFT,5) extVal = G2G.ValidatedTxtCtrl(DData,UseList[G2frame.hist]['Extinction'],0, xmin=0.,nDig=(10,2),typeHint=float) extSizer.Add(extVal,0,WACV) return extSizer def BabSizer(): def OnBabRef(event): Obj = event.GetEventObject() item,bab = Indx[Obj.GetId()] UseList[item]['Babinet']['Bab'+bab][1] = Obj.GetValue() babSizer = wx.BoxSizer(wx.HORIZONTAL) for bab in ['A','U']: babRef = wx.CheckBox(DData,wx.ID_ANY,label=' Babinet '+bab+': ') babRef.SetValue(UseList[G2frame.hist]['Babinet']['Bab'+bab][1]) Indx[babRef.GetId()] = [G2frame.hist,bab] babRef.Bind(wx.EVT_CHECKBOX, OnBabRef) babSizer.Add(babRef,0,WACV|wx.LEFT,5) babVal = G2G.ValidatedTxtCtrl(DData,UseList[G2frame.hist]['Babinet']['Bab'+bab],0, nDig=(10,3),xmin=0.,typeHint=float) babSizer.Add(babVal,0,WACV) return babSizer def FlackSizer(): def OnFlackRef(event): Obj = event.GetEventObject() UseList[G2frame.hist]['Flack'][1] = Obj.GetValue() flackSizer = wx.BoxSizer(wx.HORIZONTAL) flackRef = wx.CheckBox(DData,wx.ID_ANY,label=' Flack parameter: ') flackRef.SetValue(UseList[G2frame.hist]['Flack'][1]) flackRef.Bind(wx.EVT_CHECKBOX, OnFlackRef) flackSizer.Add(flackRef,0,WACV|wx.LEFT,5) flackVal = G2G.ValidatedTxtCtrl(DData,UseList[G2frame.hist]['Flack'],0,nDig=(10,3),typeHint=float) flackSizer.Add(flackVal,0,WACV) return flackSizer def DispSizer(): def OnDispRef(event): Obj = event.GetEventObject() UseList[G2frame.hist]['Layer Disp'][1] = Obj.GetValue() dispSizer = wx.BoxSizer(wx.HORIZONTAL) dispRef = wx.CheckBox(DData,wx.ID_ANY,label=u' Layer displacement (\xb5m): ') dispRef.SetValue(UseList[G2frame.hist]['Layer Disp'][1]) dispRef.Bind(wx.EVT_CHECKBOX, OnDispRef) dispSizer.Add(dispRef,0,WACV|wx.LEFT,5) dispSizer.Add(G2G.ValidatedTxtCtrl(DData,UseList[G2frame.hist]['Layer Disp'],0,nDig=(10,2),typeHint=float),0,WACV) return dispSizer def twinSizer(): def OnAddTwin(event): twinMat = np.array([[-1,0,0],[0,-1,0],[0,0,-1]]) #inversion by default twinVal = 0.0 UseList[G2frame.hist]['Twins'].append([twinMat,twinVal]) nNonM = UseList[G2frame.hist]['Twins'][0][1][2] for i in range(nNonM): UseList[G2frame.hist]['Twins'].append([False,0.0]) addtwin.SetValue(False) wx.CallLater(100,RepaintHistogramInfo,DData.GetScrollPos(wx.VERTICAL)) def OnMat(event): event.Skip() Obj = event.GetEventObject() it,im = Indx[Obj.GetId()] newMat = Obj.GetValue().split() try: uvw = [int(newMat[i]) for i in range(3)] except ValueError: uvw = UseList[G2frame.hist]['Twins'][it][0][im] UseList[G2frame.hist]['Twins'][it][0][im] = uvw Obj.SetValue('%3d %3d %3d'%(uvw[0],uvw[1],uvw[2])) def OnTwinVal(invalid,value,tc): it = Indx[tc.GetId()] sumTw = 0. for it,twin in enumerate(UseList[G2frame.hist]['Twins']): if it: sumTw += twin[1] UseList[G2frame.hist]['Twins'][0][1][0] = 1.-sumTw wx.CallLater(100,RepaintHistogramInfo,DData.GetScrollPos(wx.VERTICAL)) def OnTwinRef(event): Obj = event.GetEventObject() UseList[G2frame.hist]['Twins'][0][1][1] = Obj.GetValue() def OnTwinInv(event): Obj = event.GetEventObject() it = Indx[Obj.GetId()] UseList[G2frame.hist]['Twins'][it][0] = Obj.GetValue() def OnTwinDel(event): Obj = event.GetEventObject() it = Indx[Obj.GetId()] nNonM = UseList[G2frame.hist]['Twins'][0][1][2] for i in range(nNonM): del UseList[G2frame.hist]['Twins'][1+i+it] del UseList[G2frame.hist]['Twins'][it] sumTw = 0. for it,twin in enumerate(UseList[G2frame.hist]['Twins']): if it: sumTw += twin[1] UseList[G2frame.hist]['Twins'][0][1][0] = 1.-sumTw if len(UseList[G2frame.hist]['Twins']) == 1: UseList[G2frame.hist]['Twins'][0][1][1] = False wx.CallLater(100,RepaintHistogramInfo,DData.GetScrollPos(wx.VERTICAL)) nTwin = len(UseList[G2frame.hist]['Twins']) twinsizer = wx.BoxSizer(wx.VERTICAL) topsizer = wx.BoxSizer(wx.HORIZONTAL) topsizer.Add(wx.StaticText(DData,wx.ID_ANY,' Merohedral twins: '),0,WACV) #temporary - add twin not allowed if nonmerohedral twins present # if nTwin == 1 or 'bool' not in str(type(UseList[G2frame.hist]['Twins'][1][0])): addtwin = wx.CheckBox(DData,wx.ID_ANY,label=' Add Twin Law') addtwin.Bind(wx.EVT_CHECKBOX, OnAddTwin) topsizer.Add(addtwin,0,WACV|wx.LEFT,5) twinsizer.Add(topsizer) Indx = {} if nTwin > 1: for it,Twin in enumerate(UseList[G2frame.hist]['Twins']): twinMat,twinVal = Twin matSizer = wx.BoxSizer(wx.HORIZONTAL) if it: Style = wx.TE_PROCESS_ENTER TwVal = Twin[1] else: Style = wx.TE_READONLY TwVal = Twin[1][0] if 'bool' not in str(type(Twin[0])): matSizer.Add(wx.StaticText(DData,-1,' Twin Law: '),0,WACV|wx.LEFT,5) for im,Mat in enumerate(twinMat): mat = wx.TextCtrl(DData,wx.ID_ANY,'%3d %3d %3d'%(Mat[0],Mat[1],Mat[2]), style=Style) if it: Indx[mat.GetId()] = [it,im] mat.Bind(wx.EVT_TEXT_ENTER,OnMat) mat.Bind(wx.EVT_KILL_FOCUS,OnMat) else: mat.SetBackgroundColour(VERY_LIGHT_GREY) matSizer.Add(mat,0,WACV|wx.LEFT,5) else: matSizer.Add(wx.StaticText(DData,-1,' Nonmerohedral twin component %d: '%(it)),0,WACV|wx.LEFT,5) if not SGData['SGInv']: twinv = wx.CheckBox(DData,wx.ID_ANY,label=' Use enantiomorph?') twinv.SetValue(Twin[0]) Indx[twinv.GetId()] = it twinv.Bind(wx.EVT_CHECKBOX, OnTwinInv) matSizer.Add(twinv,0,WACV) twinsizer.Add(matSizer,0,wx.LEFT,5) valSizer = wx.BoxSizer(wx.HORIZONTAL) valSizer.Add(wx.StaticText(DData,-1,label=' Twin element fraction:'),0,WACV) if it: twinval = G2G.ValidatedTxtCtrl(DData,UseList[G2frame.hist]['Twins'][it],1,nDig=(10,3), xmin=0.,xmax=1.,typeHint=float,OnLeave=OnTwinVal) Indx[twinval.GetId()] = it else: twinval = wx.TextCtrl(DData,-1,'%.3f'%(TwVal),style=Style) twinval.SetBackgroundColour(VERY_LIGHT_GREY) valSizer.Add(twinval,0,WACV) if it and 'bool' not in str(type(Twin[0])): twindel = wx.CheckBox(DData,wx.ID_ANY,label=' Delete?') Indx[twindel.GetId()] = it twindel.Bind(wx.EVT_CHECKBOX, OnTwinDel) valSizer.Add(twindel,0,WACV) elif not it: twinref = wx.CheckBox(DData,wx.ID_ANY,label=' Refine?') twinref.SetValue(Twin[1][1]) twinref.Bind(wx.EVT_CHECKBOX, OnTwinRef) valSizer.Add(twinref,0,WACV) twinsizer.Add(valSizer,0,wx.LEFT,5) return twinsizer def OnSelect(event): G2frame.hist = G2frame.dataWindow.HistsInPhase[DData.select.GetSelection()] oldFocus = wx.Window.FindFocus() G2plt.PlotSizeStrainPO(G2frame,data,G2frame.hist) wx.CallLater(100,RepaintHistogramInfo) if oldFocus: wx.CallAfter(oldFocus.SetFocus) def RepaintHistogramInfo(Scroll=0): if 'phoenix' in wx.version(): G2frame.bottomSizer.Clear(True) # deal with case where this is called after another tree item has been selected try: DData.Shown except RuntimeError: if GSASIIpath.GetConfigValue('debug'): print('DBG: DData window deleted. Ignoring RepaintHistogramInfo, forcing redraw') # Repaint called while DData window deleted, force redraw of entire window from . import GSASIIdataGUI G2frame.PickIdText = '' wx.CallLater(100,GSASIIdataGUI.SelectDataTreeItem,G2frame,G2frame.GPXtree.Selection) return else: # deal with case where this is called after another tree item has been selected if DData.__class__ is not wx._windows.ScrolledWindow: # fix bug where this is called after the Window is deleted return G2frame.bottomSizer.DeleteWindows() Indx.clear() G2frame.bottomSizer,LeBailMsg = ShowHistogramInfo() mainSizer.Add(G2frame.bottomSizer) mainSizer.Layout() G2frame.dataWindow.Refresh() DData.SetVirtualSize(mainSizer.GetMinSize()) DData.Scroll(0,Scroll) G2frame.dataWindow.SendSizeEvent() if LeBailMsg: G2G.G2MessageBox(G2frame,LeBailMsg,title='LeBail refinement changes') def ShowHistogramInfo(): '''This creates a sizer with all the information pulled out from the Phase/data dict ''' def OnUseData(event): Obj = event.GetEventObject() UseList[G2frame.hist]['Use'] = Obj.GetValue() wx.CallLater(100,RepaintHistogramInfo,DData.GetScrollPos(wx.VERTICAL)) def OnLeBail(event): '''Toggle the LeBail flag (Phase['Histograms'][hist]['LeBail'] and when turned on, set the Controls['newLeBail'] flag to indicate that the a new Le Bail extraction will be performed at the next refinement ''' UseList[G2frame.hist]['LeBail'] = not UseList[G2frame.hist]['LeBail'] if UseList[G2frame.hist]['LeBail']: Controls['newLeBail'] = True else: Controls['newLeBail'] = False wx.CallLater(100,RepaintHistogramInfo,DData.GetScrollPos(wx.VERTICAL)) def OnResetSize(event): Obj = event.GetEventObject() item,name = Indx[Obj.GetId()] if name == 'isotropic': UseList[item]['Size'][1][0] = 1.0 elif name == 'uniaxial': UseList[item]['Size'][1][0] = 1.0 UseList[item]['Size'][1][1] = 1.0 elif name == 'ellipsoidal': for i in range(3): UseList[item]['Size'][4][i] = 1.0 UseList[item]['Size'][4][i+3] = 0.0 G2plt.PlotSizeStrainPO(G2frame,data,item) wx.CallLater(100,RepaintHistogramInfo,DData.GetScrollPos(wx.VERTICAL)) def OnSizeAxis(event): event.Skip() Obj = event.GetEventObject() Saxis = Obj.GetValue().split() try: hkl = [int(Saxis[i]) for i in range(3)] except (ValueError,IndexError): hkl = UseList[G2frame.hist]['Size'][3] if not np.any(np.array(hkl)): hkl = UseList[G2frame.hist]['Size'][3] UseList[G2frame.hist]['Size'][3] = hkl h,k,l = hkl Obj.SetValue('%3d %3d %3d'%(h,k,l)) def OnFixVals(event): Obj = event.GetEventObject() UseList[G2frame.hist]['Fix FXU'] = Obj.GetValue() if G2frame.hist not in UseList: G2frame.ErrorDialog('Missing data error', G2frame.hist+' not in GSAS-II data tree') return #patch if 'Use' not in UseList[G2frame.hist]: UseList[G2frame.hist]['Use'] = True if 'Babinet' not in UseList[G2frame.hist]: UseList[G2frame.hist]['Babinet'] = {'BabA':[0.0,False],'BabU':[0.0,False]} if 'Fix FXU' not in UseList[G2frame.hist]: UseList[G2frame.hist]['Fix FXU'] = ' ' if 'FixedSeqVars' not in UseList[G2frame.hist]: UseList[G2frame.hist]['FixedSeqVars'] = [] if 'HKLF' in UseList[G2frame.hist]['Histogram']: if 'Flack' not in UseList[G2frame.hist]: UseList[G2frame.hist]['Flack'] = [0.0,False] if 'Twins' not in UseList[G2frame.hist]: UseList[G2frame.hist]['Twins'] = [[np.array([[1,0,0],[0,1,0],[0,0,1]]),[1.0,False]],] if 'Ma' not in UseList[G2frame.hist]['Extinction'][2]: UseList[G2frame.hist]['Extinction'][2].update({'Ma':[0.0,False]}) UseList[G2frame.hist]['Extinction'][2].update({'Mb':[0.0,False]}) if 'Mc' not in UseList[G2frame.hist]['Extinction'][2]: UseList[G2frame.hist]['Extinction'][2].update({'Mc':[0.0,False]}) elif 'PWDR' in UseList[G2frame.hist]['Histogram']: if 'LeBail' not in UseList[G2frame.hist]: UseList[G2frame.hist]['LeBail'] = False if 'Layer Disp' not in UseList[G2frame.hist]: UseList[G2frame.hist]['Layer Disp'] = [0.0,False] #end patch ifkeV = 'E' in UseList[G2frame.hist].get('Type','') offMsg = '' bottomSizer = wx.BoxSizer(wx.VERTICAL) useBox = wx.BoxSizer(wx.HORIZONTAL) useData = wx.CheckBox(DData,wx.ID_ANY,label='Use Histogram: '+G2frame.hist+' ?') useData.Bind(wx.EVT_CHECKBOX, OnUseData) useData.SetValue(UseList[G2frame.hist]['Use']) useBox.Add(useData,0,WACV) Htype = UseList[G2frame.hist].get('Type','SXC') useBox.Add(wx.StaticText(DData,label=' Histogram type: '+Htype)) if not generalData['doPawley'] and 'PWDR' in G2frame.hist[:4]: lbLabel = 'Start Le Bail extraction? ' if UseList[G2frame.hist]['LeBail']: lbLabel = 'Stop Le Bail extraction?' G2frame.SetStatusText('To reset Le Bail extracted intensities, cycle Le Bail button.',1) lebail = wx.Button(DData,wx.ID_ANY,label=lbLabel) lebail.Bind(wx.EVT_BUTTON, OnLeBail) useBox.Add(lebail,0,WACV) bottomSizer.Add(useBox) G2G.HorizontalLine(bottomSizer,DData) if G2frame.testSeqRefineMode() and not UseList[G2frame.hist]['LeBail']: bottomSizer.Add(wx.StaticText(DData,label=' Sequential Refinement Options')) parmChoice = [' ','X','XU','U','F','FX','FXU','FU'] if generalData['Type'] == 'magnetic': parmChoice += ['M','MX','MXU','MU','MF','MFX','MFXU','MFU'] fixBox = wx.BoxSizer(wx.HORIZONTAL) fixBox.Add(wx.StaticText(DData,label=' Fix these var types: '),0,WACV) fixVals = wx.ComboBox(DData,value=UseList[G2frame.hist]['Fix FXU'],choices=parmChoice, style=wx.CB_DROPDOWN) fixVals.Bind(wx.EVT_COMBOBOX,OnFixVals) fixBox.Add(fixVals,0,WACV) fixBox.Add(wx.StaticText(DData,label=' in phase '+generalData['Name']+' for this histogram'),0,WACV) bottomSizer.Add(fixBox) SeqId = G2gd.GetGPXtreeItemId(G2frame, G2frame.root, 'Sequential results') if SeqId: fixBox = wx.BoxSizer(wx.HORIZONTAL) fixBox.Add(wx.StaticText(DData,label=' Specific phase variables to fix for this histogram: '),0,WACV) addFixed = wx.Button(DData,wx.ID_ANY,label='Select Vars') fixBox.Add(addFixed,0,WACV) addFixed.Bind(wx.EVT_BUTTON,OnAddFixed) fixedVars = UseList[G2frame.hist].get('FixedSeqVars',[]) if len(fixedVars): fixBox.Add(wx.StaticText(DData,label=' (currently {} fixed)'.format(len(fixedVars))),0,WACV) bottomSizer.Add(fixBox) if 'HKLF' in G2frame.hist[:4] or not UseList[G2frame.hist]['LeBail']: bottomSizer.Add(ScaleSizer(),0,wx.BOTTOM,5) else: # if phase fraction/scale is hidden, turn off flag UseList[G2frame.hist]['Scale'][1] = False if G2frame.hist[:4] == 'PWDR': if UseList[G2frame.hist]['Size'][0] == 'isotropic': isoSizer = wx.BoxSizer(wx.HORIZONTAL) isoSizer.Add(TopSizer(' Domain size model: ',['isotropic','uniaxial','ellipsoidal'], 'Size',OnSizeType),0,WACV) isoSizer.Add(LGmixSizer('Size',[0.,1.],OnLGmixRef)) isoSizer.Add(ResetSizer('isotropic',OnResetSize),0,WACV) bottomSizer.Add(isoSizer) bottomSizer.Add(IsoSizer(u'size(\xb5m): ','Size',(10,4),[0.,10.],OnSizeRef),0,wx.BOTTOM,5) elif UseList[G2frame.hist]['Size'][0] == 'uniaxial': uniSizer = wx.BoxSizer(wx.HORIZONTAL) uniSizer.Add(TopSizer(' Domain size model: ',['isotropic','uniaxial','ellipsoidal'], 'Size',OnSizeType),0,WACV) uniSizer.Add(LGmixSizer('Size',[0.,1.],OnLGmixRef)) uniSizer.Add(ResetSizer('uniaxial',OnResetSize),0,WACV) bottomSizer.Add(UniSizer('Size',OnSizeAxis),0) bottomSizer.Add(uniSizer) bottomSizer.Add(UniDataSizer(u'size(\xb5m): ','Size',(10,3),[0.,10.],OnSizeRef),0,wx.BOTTOM,5) elif UseList[G2frame.hist]['Size'][0] == 'ellipsoidal': ellSizer = wx.BoxSizer(wx.HORIZONTAL) ellSizer.Add(TopSizer(' Domain size model: ',['isotropic','uniaxial','ellipsoidal'], 'Size',OnSizeType),0,WACV) ellSizer.Add(LGmixSizer('Size',[0.,1.],OnLGmixRef)) ellSizer.Add(ResetSizer('ellipsoidal',OnResetSize),0,WACV) bottomSizer.Add(ellSizer) bottomSizer.Add(EllSizeDataSizer(),0,wx.BOTTOM,5) if UseList[G2frame.hist]['Mustrain'][0] == 'isotropic': isoSizer = wx.BoxSizer(wx.HORIZONTAL) isoSizer.Add(TopSizer(' Mustrain model: ',['isotropic','uniaxial','generalized',], 'Mustrain',OnStrainType),0,WACV) isoSizer.Add(LGmixSizer('Mustrain',[0.,1.],OnLGmixRef)) isoSizer.Add(ResetSizer('isotropic',OnResetStrain),0,WACV) bottomSizer.Add(isoSizer) bottomSizer.Add(IsoSizer(' microstrain: ','Mustrain',(10,1),[0.,1.e5],OnStrainRef),0,wx.BOTTOM,5) elif UseList[G2frame.hist]['Mustrain'][0] == 'uniaxial': uniSizer = wx.BoxSizer(wx.HORIZONTAL) uniSizer.Add(TopSizer(' Mustrain model: ',['isotropic','uniaxial','generalized',], 'Mustrain',OnStrainType),0,WACV) uniSizer.Add(LGmixSizer('Mustrain',[0.,1.],OnLGmixRef)) uniSizer.Add(ResetSizer('uniaxial',OnResetStrain),0,WACV) bottomSizer.Add(uniSizer) bottomSizer.Add(UniSizer('Mustrain',OnStrainAxis),0) bottomSizer.Add(UniDataSizer('mustrain: ','Mustrain',(10,1),[0.,1.e5],OnStrainRef),0,wx.BOTTOM,5) elif UseList[G2frame.hist]['Mustrain'][0] == 'generalized': genSizer = wx.BoxSizer(wx.HORIZONTAL) genSizer.Add(TopSizer(' Mustrain model: ',['isotropic','uniaxial','generalized',], 'Mustrain',OnStrainType),0,WACV) genSizer.Add(LGmixSizer('Mustrain',[0.,1.],OnLGmixRef)) genSizer.Add(ResetSizer('generalized',OnResetStrain),0,WACV) bottomSizer.Add(genSizer) bottomSizer.Add(GenStrainDataSizer(),0,wx.BOTTOM,5) bottomSizer.Add(wx.StaticText(DData,wx.ID_ANY,' Hydrostatic/elastic strain:')) bottomSizer.Add(HstrainSizer()) bottomSizer.Add(DispSizer()) if not UseList[G2frame.hist]['LeBail'] and not ifkeV: poSizer = wx.BoxSizer(wx.VERTICAL) POData = UseList[G2frame.hist]['Pref.Ori.'] # patch - add penalty items if len(POData) < 7: POData.append(['',]) POData.append(0.1) if not POData[6]: POData[6] = ['',] # end patch poSizer.Add(PoTopSizer(POData)) if POData[0] == 'MD': poSizer.Add(MDDataSizer(POData)) else: #'SH' if POData[4]: #SH order > 0 textJ = G2lat.textureIndex(POData[5]) poSizer.Add(wx.StaticText(DData,wx.ID_ANY,' Spherical harmonic coefficients: '+'Texture index: %.3f'%(textJ)) ,0,wx.TOP|wx.BOTTOM,5) poSizer.Add(SHDataSizer(POData)) #,0,wx.TOP|wx.BOTTOM,5) try: poSizer.Add(SHPenalty(POData)) #,0,wx.TOP|wx.BOTTOM,5) except: print('SHPenalty error occurred') bottomSizer.Add(poSizer) #,0,wx.TOP|wx.BOTTOM,5) bottomSizer.Add(ExtSizer('PWDR',Htype),0,wx.TOP|wx.BOTTOM,5) if generalData['Type'] != 'magnetic': bottomSizer.Add(BabSizer(),0,wx.BOTTOM,5) else: # turn off preferred orientation fitting in LeBail mode (hidden) UseList[G2frame.hist]['Pref.Ori.'][2] = False for bab in ['A','U']: UseList[G2frame.hist]['Babinet']['Bab'+bab][1] = False # TODO: should turn off all Extinction refinement flags UseList[G2frame.hist]['Extinction'][1] = False elif G2frame.hist[:4] == 'HKLF': bottomSizer.Add(ExtSizer('HKLF',Htype)) #,0,wx.BOTTOM,5) bottomSizer.Add(BabSizer()) #,0,wx.BOTTOM,5) if not SGData['SGInv'] and len(UseList[G2frame.hist]['Twins']) < 2: bottomSizer.Add(FlackSizer()) #,0,wx.BOTTOM,5) bottomSizer.Add(twinSizer()) #,0,wx.BOTTOM,5) return bottomSizer,offMsg ###################################################################### #### Beginning of UpdateDData execution here ###################################################################### Controls = G2frame.GPXtree.GetItemPyData(G2gd.GetGPXtreeItemId(G2frame,G2frame.GPXtree.root, 'Controls')) G2frame.SetStatusText('',1) keyList = G2frame.GetHistogramNames(['PWDR','HKLF']) UseList = data['Histograms'] # look for histgrams that are no longer in the project (can happen when histogram deleted from tree) broken = [i for i in UseList if i not in keyList] if broken: msg = 'Removing histogram(s) referenced in this phase that are no longer in project:\n\n' for i,j in enumerate(broken): if i > 0: msg += ', ' msg += j del data['Histograms'][j] G2G.G2MessageBox(G2frame,msg,'Dereferencing Removed histograms') if UseList: G2frame.dataWindow.DataMenu.Enable(G2G.wxID_DATADELETE,True) for item in G2frame.Refine: item.Enable(True) else: G2frame.dataWindow.DataMenu.Enable(G2G.wxID_DATADELETE,False) for item in G2frame.Refine: item.Enable(False) # make a list of histograms (any type) used in this phase, ordered as in tree G2frame.dataWindow.HistsInPhase = [name for name in keyList if name in UseList] generalData = data['General'] cell = generalData['Cell'][1:] Amat,Bmat = G2lat.cell2AB(cell[:6]) PhaseName = generalData['Name'] SGData = generalData['SGData'] if len(G2frame.dataWindow.HistsInPhase) == 0: # no associated histograms, nothing to display here G2frame.hist = '' elif hist and hist in G2frame.dataWindow.HistsInPhase: # something was input as a selection as an argument G2frame.hist = hist elif (not G2frame.hist) or (G2frame.hist not in G2frame.dataWindow.HistsInPhase): # no or bad selection but have data, take the first G2frame.hist = G2frame.dataWindow.HistsInPhase[0] Indx = {} if DData.GetSizer(): try: if hasattr(DData,'select'): DData.select.Unbind(wx.EVT_LISTBOX) # remove binding to avoid event on Linux except: pass DData.GetSizer().Clear(True) mainSizer = wx.BoxSizer(wx.VERTICAL) topSizer = G2frame.dataWindow.topBox topSizer.Clear(True) parent = G2frame.dataWindow.topPanel lbl= f"Histogram-specific parameters for Phase {data['General']['Name']!r}"[:60] topSizer.Add(wx.StaticText(parent,label=lbl),0,WACV) topSizer.Add((-1,-1),1,wx.EXPAND) topSizer.Add(G2G.HelpButton(parent,helpIndex=G2frame.dataWindow.helpKey)) wx.CallAfter(G2frame.dataWindow.SetDataSize) LeBailMsg = None if G2frame.hist: topSizer = wx.FlexGridSizer(1,2,5,5) DData.select = wx.ListBox(DData,choices=G2frame.dataWindow.HistsInPhase, style=wx.LB_SINGLE,size=(-1,160)) DData.select.SetSelection(G2frame.dataWindow.HistsInPhase.index(G2frame.hist)) DData.select.SetFirstItem(G2frame.dataWindow.HistsInPhase.index(G2frame.hist)) DData.select.Bind(wx.EVT_LISTBOX,OnSelect) topSizer.Add(DData.select,0,WACV|wx.LEFT,5) if any(['PWDR' in item for item in keyList]): topSizer.Add(PlotSizer()) mainSizer.Add(topSizer) G2frame.bottomSizer,LeBailMsg = ShowHistogramInfo() mainSizer.Add(G2frame.bottomSizer) elif not keyList: mainSizer.Add(wx.StaticText(DData,wx.ID_ANY, ' (This project has no data; use Import to read it)'),0,wx.TOP,10) elif not UseList in G2frame.dataWindow.HistsInPhase: mainSizer.Add(wx.StaticText(DData,wx.ID_ANY, ' (This phase has no associated data; use appropriate Edit/Add... menu item)'),0,wx.TOP,10) else: mainSizer.Add(wx.StaticText(DData,wx.ID_ANY,' (Strange, how did we get here?)'),0,wx.TOP,10) G2phG.SetPhaseWindow(DData,mainSizer,Scroll=Scroll) if LeBailMsg: G2G.G2MessageBox(G2frame,LeBailMsg,title='LeBail refinement changes')
[docs] def MakeHistPhaseWin(G2frame): '''Display Phase/Data (HAP) info from a Hist/Phase tree item. Used when the HAP info is shown as if a top-level entry in the data tree (see the SeparateHistPhaseTreeItem config option). This code is not used when the HAP info is shown in its original location, the Data tab in the Phase info. ''' TabSelectionIdDict = {} def OnSelectPage(event): 'Called when an item is selected from the Select page menu' tabname = TabSelectionIdDict.get(event.GetId()) # lookup phase if not tabname: print ('Warning: menu item not in dict! id= %d'%event.GetId()) return # find the tab matching the phase for i,page in enumerate(phaseList): if tabname == phaseList[i]: HAPBook.SetSelection(i) wx.CallAfter(FillDDataWindow,i) # may result in a double paint on some OSs return else: print ("Warning: tab "+tabname+" was not found") def OnPageChanged(event): 'respond to a notebook tab' page = event.GetSelection() wx.CallAfter(FillDDataWindow,page) def getDDataWindow(): 'Get the current scrollwindow for selected phase' return DData[HAPBook.GetSelection()] def getDDataPhaseinfo(): 'Get the data tree entry for the currently selected phase' page = HAPBook.GetSelection() return G2frame.GPXtree.GetItemPyData(phaseIds[page]) def FillDDataWindow(page): 'display the DData info' G2frame.HistPhaseLastSel = phaseList[page] data = G2frame.GPXtree.GetItemPyData(phaseIds[page]) G2plt.PlotSizeStrainPO(G2frame,data,hist='') UpdateDData(G2frame,DData[page],data) #### G2frame.dataWindow.DataMenu/"Edit Phase" menu routines follow # where these duplicate similar routines in GSASIIphsGUI.py. def OnHklfAdd(event): '''Called to link a Single Xtal (HKLF) dataset to a selected phase. Most commonly, the histogram and phase are linked when the latter item is read in (routines OnImportPhase or OnImportSfact in func:`GSASIIdataGUI.GSASIImain`, but one can defer this or change the linking later using this routine. Note that this nearly identical to routine OnHklfAdd inside :func:`GSASIIphsGUI.UpdatePhaseData`. ''' data = getDDataPhaseinfo() result = G2phG.CheckAddHKLF(G2frame,data) if result is None: return wx.CallAfter(UpdateDData,G2frame,getDDataWindow(),data) def OnDataUse(event): data = getDDataPhaseinfo() # hist = G2frame.hist if data['Histograms']: dlg = G2G.G2MultiChoiceDialog(G2frame, 'Use histograms', 'Use which histograms?',G2frame.dataWindow.HistsInPhase) try: if dlg.ShowModal() == wx.ID_OK: sel = dlg.GetSelections() for Id,item in enumerate(G2frame.dataWindow.HistsInPhase): if Id in sel: data['Histograms'][item]['Use'] = True else: data['Histograms'][item]['Use'] = False finally: dlg.Destroy() wx.CallAfter(UpdateDData,G2frame,getDDataWindow(),data) def OnDataCopy(event): data = getDDataPhaseinfo() hist = G2frame.hist keyList = G2frame.dataWindow.HistsInPhase[:] if hist in keyList: keyList.remove(hist) if not keyList: G2G.G2MessageBox(G2frame,'No histograms to copy to') return sourceDict = copy.deepcopy(data['Histograms'][hist]) if 'HKLF' in sourceDict['Histogram']: copyNames = ['Extinction','Babinet','Flack','Twins'] else: #PWDR copyNames = ['Pref.Ori.','Size','Mustrain','HStrain','Extinction','Babinet','LeBail','Layer Disp'] copyNames += ['Scale','Fix FXU','FixedSeqVars'] copyDict = {} for name in copyNames: if name not in sourceDict: continue copyDict[name] = copy.deepcopy(sourceDict[name]) #force copy dlg = G2G.G2MultiChoiceDialog(G2frame,u'Copy phase/histogram parameters\nfrom '+hist[5:][:35], 'Copy phase/hist parameters', keyList) try: if dlg.ShowModal() == wx.ID_OK: for sel in dlg.GetSelections(): data['Histograms'][keyList[sel]].update(copy.deepcopy(copyDict)) finally: dlg.Destroy() def OnDataCopyFlags(event): data = getDDataPhaseinfo() hist = G2frame.hist sourceDict = copy.deepcopy(data['Histograms'][hist]) copyDict = {} if 'HKLF' in sourceDict['Histogram']: copyNames = ['Extinction','Babinet','Flack','Twins'] else: #PWDR copyNames = ['Pref.Ori.','Size','Mustrain','HStrain','Extinction','Babinet','Layer Disp'] copyNames += ['Scale','Fix FXU','FixedSeqVars'] babNames = ['BabA','BabU'] for name in copyNames: if name not in sourceDict: continue if name in ['Scale','Extinction','HStrain','Flack','Twins','Layer Disp']: if name == 'Extinction' and 'HKLF' in sourceDict['Histogram']: copyDict[name] = {name:[sourceDict[name][:2]]} for item in ['Eg','Es','Ep']: copyDict[name][item] = sourceDict[name][2][item][1] elif name == 'Twins': copyDict[name] = sourceDict[name][0][1][1] else: copyDict[name] = sourceDict[name][1] elif name in ['Size','Mustrain']: copyDict[name] = [sourceDict[name][0],sourceDict[name][2],sourceDict[name][5]] elif name == 'Pref.Ori.': copyDict[name] = [sourceDict[name][0],sourceDict[name][2]] if sourceDict[name][0] == 'SH': SHterms = sourceDict[name][5] SHflags = {} for item in SHterms: SHflags[item] = SHterms[item] copyDict[name].append(SHflags) elif name == 'Babinet': copyDict[name] = {} for bab in babNames: copyDict[name][bab] = sourceDict[name][bab][1] elif name in ['Fix FXU','FixedSeqVars']: copyDict[name] = copy.deepcopy(sourceDict[name]) keyList = G2frame.dataWindow.HistsInPhase[:] if hist in keyList: keyList.remove(hist) if not keyList: G2G.G2MessageBox(G2frame,'No histograms to copy to') return dlg = G2G.G2MultiChoiceDialog(G2frame,u'Copy phase/histogram flags\nfrom '+hist[5:][:35], 'Copy phase/hist flags', keyList) try: if dlg.ShowModal() == wx.ID_OK: for sel in dlg.GetSelections(): item = keyList[sel] for name in copyNames: if name not in sourceDict: continue if name in ['Scale','Extinction','HStrain','Flack','Twins','Layer Disp']: if name == 'Extinction' and 'HKLF' in sourceDict['Histogram']: data['Histograms'][item][name][:2] = copy.deepcopy(sourceDict[name][:2]) for itm in ['Eg','Es','Ep']: data['Histograms'][item][name][2][itm][1] = copy.deepcopy(copyDict[name][itm]) elif name == 'Twins': data['Histograms'][item]['Twins'][0][1][1] = copy.deepcopy(copyDict['Twins']) else: try: data['Histograms'][item][name][1] = copy.deepcopy(copyDict[name]) except KeyError: continue elif name in ['Size','Mustrain']: data['Histograms'][item][name][0] = copy.deepcopy(copyDict[name][0]) data['Histograms'][item][name][2] = copy.deepcopy(copyDict[name][1]) data['Histograms'][item][name][5] = copy.deepcopy(copyDict[name][2]) elif name == 'Pref.Ori.': data['Histograms'][item][name][0] = copy.deepcopy(copyDict[name][0]) data['Histograms'][item][name][2] = copy.deepcopy(copyDict[name][1]) if sourceDict[name][0] == 'SH': SHflags = copy.deepcopy(copyDict[name][2]) SHterms = copy.deepcopy(sourceDict[name][5]) data['Histograms'][item][name][6] = copy.deepcopy(sourceDict[name][6]) data['Histograms'][item][name][7] = copy.deepcopy(sourceDict[name][7]) elif name == 'Babinet': for bab in babNames: data['Histograms'][item][name][bab][1] = copy.deepcopy(copyDict[name][bab]) elif name in ['Fix FXU','FixedSeqVars']: data['Histograms'][item][name] = copy.deepcopy(sourceDict[name]) finally: dlg.Destroy() def OnSelDataCopy(event): data = getDDataPhaseinfo() hist = G2frame.hist sourceDict = data['Histograms'][hist] keyList = G2frame.dataWindow.HistsInPhase[:] if hist in keyList: keyList.remove(hist) if not keyList: G2G.G2MessageBox(G2frame,'No histograms to copy to') return if 'HKLF' in sourceDict['Histogram']: copyNames = ['Extinction','Babinet','Flack','Twins'] else: #PWDR copyNames = ['Pref.Ori.','Size','Mustrain','HStrain','Extinction','Babinet','LeBail','Layer Disp'] copyNames += ['Scale','Fix FXU','FixedSeqVars'] dlg = G2G.G2MultiChoiceDialog(G2frame,'Select which parameters to copy', 'Select phase data parameters', copyNames) selectedItems = [] try: if dlg.ShowModal() == wx.ID_OK: selectedItems = [copyNames[i] for i in dlg.GetSelections()] finally: dlg.Destroy() if not selectedItems: return # nothing to copy copyDict = {} for parm in selectedItems: if parm not in sourceDict: continue copyDict[parm] = copy.deepcopy(sourceDict[parm]) dlg = G2G.G2MultiChoiceDialog(G2frame,u'Copy selected phase/histogram parameters\nfrom '+hist[5:][:35], 'Copy selected phase/hist parameters', keyList) try: if dlg.ShowModal() == wx.ID_OK: for sel in dlg.GetSelections(): data['Histograms'][keyList[sel]].update(copy.deepcopy(copyDict)) finally: dlg.Destroy() def OnPwdrAdd(event): data = getDDataPhaseinfo() generalData = data['General'] SGData = generalData['SGData'] newList = [] NShkl = len(G2spc.MustrainNames(SGData)) NDij = len(G2spc.HStrainNames(SGData)) keyList = data['Histograms'].keys() TextList = [] if G2frame.GPXtree.GetCount(): item, cookie = G2frame.GPXtree.GetFirstChild(G2frame.root) while item: name = G2frame.GPXtree.GetItemText(item) if name not in keyList and 'PWDR' in name: TextList.append(name) item, cookie = G2frame.GPXtree.GetNextChild(G2frame.root, cookie) if not TextList: G2G.G2MessageBox(G2frame,'No histograms') return dlg = G2G.G2MultiChoiceDialog(G2frame, 'Select powder histograms to use', 'Use data',TextList) try: if dlg.ShowModal() == wx.ID_OK: result = dlg.GetSelections() for i in result: newList.append(TextList[i]) if 'All PWDR' in newList: newList = TextList[1:] for histoName in newList: Id = G2gd.GetGPXtreeItemId(G2frame,G2frame.root,histoName) data['Histograms'][histoName] = {'Histogram':histoName,'Show':False,'LeBail':False, 'Scale':[1.0,False],'Pref.Ori.':['MD',1.0,False,[0,0,1],0,{},['',],0.1], 'Size':['isotropic',[1.,1.,1.],[False,False,False],[0,0,1], [1.,1.,1.,0.,0.,0.],6*[False,]], 'Mustrain':['isotropic',[1000.0,1000.0,1.0],[False,False,False],[0,0,1], NShkl*[0.01,],NShkl*[False,]], 'HStrain':[NDij*[0.0,],NDij*[False,]], 'Layer Disp':[0.0,False], 'Extinction':[0.0,False],'Babinet':{'BabA':[0.0,False],'BabU':[0.0,False]},'Fix FXU':' ','FixedSeqVars':[]} refList = G2frame.GPXtree.GetItemPyData(G2gd.GetGPXtreeItemId(G2frame,Id,'Reflection Lists')) refList[generalData['Name']] = {} wx.CallAfter(UpdateDData,G2frame,getDDataWindow(),data) finally: dlg.Destroy() def OnDataDelete(event): data = getDDataPhaseinfo() if G2frame.dataWindow.HistsInPhase: DelList = [] extraOpts= {'label_0':'Remove from all phases','value_0':False} h,pd = G2frame.GetUsedHistogramsAndPhasesfromTree() if len(pd) > 1: opts = extraOpts else: opts = {} dlg = G2G.G2MultiChoiceDialog(G2frame, 'Select histogram(s) to remove \nfrom this phase:', 'Remove histograms', G2frame.dataWindow.HistsInPhase, extraOpts=opts) try: if dlg.ShowModal() == wx.ID_OK: DelList = [G2frame.dataWindow.HistsInPhase[i] for i in dlg.GetSelections()] finally: dlg.Destroy() if extraOpts['value_0']: for p in pd: for i in DelList: if i in pd[p]['Histograms']: del pd[p]['Histograms'][i] else: for i in DelList: del data['Histograms'][i] wx.CallLater(100,UpdateDData,G2frame,getDDataWindow(),data) def OnDataApplyStrain(event): data = getDDataPhaseinfo() SGData = data['General']['SGData'] DijVals = data['Histograms'][G2frame.hist]['HStrain'][0][:] # apply the Dij values to the reciprocal cell newA = [] Dijdict = dict(zip(G2spc.HStrainNames(SGData),DijVals)) for Aij,lbl in zip(G2lat.cell2A(data['General']['Cell'][1:7]), ['D11','D22','D33','D12','D13','D23']): newA.append(Aij + Dijdict.get(lbl,0.0)) # convert back to direct cell data['General']['Cell'][1:7] = G2lat.A2cell(newA) data['General']['Cell'][7] = G2lat.calc_V(newA) # subtract the selected histograms Dij values from all for this phase for hist in data['Histograms']: for i,val in enumerate(DijVals): data['Histograms'][hist]['HStrain'][0][i] -= val # for hist in sorted(data['Histograms']): # list effective lattice constants applying Dij values # DijVals = data['Histograms'][hist]['HStrain'][0] # newA = [] # Dijdict = dict(zip(G2spc.HStrainNames(SGData),DijVals)) # for Aij,lbl in zip(G2lat.cell2A(data['General']['Cell'][1:7]), # ['D11','D22','D33','D12','D13','D23']): # newA.append(Aij + Dijdict.get(lbl,0.0)) # print(hist, G2lat.A2cell(newA)[:3], G2lat.calc_V(newA)) wx.CallAfter(UpdateDData,G2frame,getDDataWindow(),data) #### start of MakeHistPhaseWin. # binds the menu items and shows the Data Window info G2frame.dataWindow.ClearData() HAPBook = G2G.GSNoteBook(parent=G2frame.dataWindow) mainSizer = wx.BoxSizer(wx.VERTICAL) G2frame.dataWindow.SetSizer(mainSizer) mainSizer.Add(HAPBook,1,wx.ALL|wx.EXPAND,1) phaseList = [] phaseIds = [] DData = [] sub = G2gd.GetGPXtreeItemId(G2frame,G2frame.root,'Phases') item, cookie = G2frame.GPXtree.GetFirstChild(sub) while item: # loop over phases phaseName = G2frame.GPXtree.GetItemText(item) phaseIds.append(item) phaseList.append(phaseName) item, cookie = G2frame.GPXtree.GetNextChild(sub, cookie) HAPtab = wx.ScrolledWindow(HAPBook) HAPBook.AddPage(HAPtab,phaseName) DData.append(HAPtab) HAPBook.Bind(wx.aui.EVT_AUINOTEBOOK_PAGE_CHANGED, OnPageChanged) # must setup all Phase tabs to get the DataMenu G2gd.SetDataMenuBar(G2frame,G2frame.dataWindow.DataGeneral) # set up "Select tab" menu contents G2gd.SetDataMenuBar(G2frame,G2frame.dataWindow.DataMenu) mid = G2frame.dataWindow.DataMenu.FindMenu('Select tab') menu = G2frame.dataWindow.DataMenu.GetMenu(mid) items = menu.GetMenuItems() for item in items: menu.Remove(item) if len(phaseList) == 0: return for i,page in enumerate(phaseList): Id = wx.NewId() if menu.FindItem(page) >= 0: continue # is tab already in menu? menu.Append(Id,page,'') TabSelectionIdDict[Id] = page G2frame.Bind(wx.EVT_MENU, OnSelectPage, id=Id) # define commands in G2frame.dataWindow.DataMenu/"Edit Phase" menu G2frame.Bind(wx.EVT_MENU, OnDataUse, id=G2G.wxID_DATAUSE) G2frame.Bind(wx.EVT_MENU, OnDataCopy, id=G2G.wxID_DATACOPY) G2frame.Bind(wx.EVT_MENU, OnDataCopyFlags, id=G2G.wxID_DATACOPYFLAGS) G2frame.Bind(wx.EVT_MENU, OnSelDataCopy, id=G2G.wxID_DATASELCOPY) G2frame.Bind(wx.EVT_MENU, OnPwdrAdd, id=G2G.wxID_PWDRADD) G2frame.Bind(wx.EVT_MENU, OnHklfAdd, id=G2G.wxID_HKLFADD) G2frame.Bind(wx.EVT_MENU, OnDataDelete, id=G2G.wxID_DATADELETE) G2frame.Bind(wx.EVT_MENU, OnDataApplyStrain, id=G2G.wxID_DATADIJ) # display the last-selected phase or the 1st try: G2frame.HistPhaseLastSel except: G2frame.HistPhaseLastSel = phaseList[0] if G2frame.HistPhaseLastSel in phaseList: page = phaseList.index(G2frame.HistPhaseLastSel) else: page = 0 HAPBook.SetSelection(page) wx.CallAfter(FillDDataWindow,page)