Source code for GSASIIddataGUI

# -*- coding: utf-8 -*-
#GSASII - phase data display routines
########### SVN repository information ###################
# $Date: 2023-10-09 08:44:52 -0500 (Mon, 09 Oct 2023) $
# $Author: vondreele $
# $Revision: 5669 $
# $URL: https://subversion.xray.aps.anl.gov/pyGSAS/trunk/GSASIIddataGUI.py $
# $Id: GSASIIddataGUI.py 5669 2023-10-09 13:44:52Z vondreele $
########### SVN repository information ###################
'''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
import GSASIIpath
GSASIIpath.SetVersionNumber("$Revision: 5669 $")
import GSASIIlattice as G2lat
import GSASIIspc as G2spc
import GSASIIplot as G2plt
import GSASIIpwd as G2pwd
import GSASIIphsGUI as G2phG
import GSASIIctrlGUI as G2G
import GSASIIdataGUI as G2gd
import GSASIIfiles as G2fil

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}

[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): Obj = event.GetEventObject() Order = int(Obj.GetValue()) UseList[G2frame.hist]['Pref.Ori.'][4] = Order UseList[G2frame.hist]['Pref.Ori.'][5] = SetPOCoef(Order,G2frame.hist) wx.CallLater(100,RepaintHistogramInfo,DData.GetScrollPos(wx.VERTICAL)) def OnPOType(event): 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,hist): cofNames = G2lat.GenSHCoeff(SGData['SGLaue'],'0',Order,False) #cylindrical & no M newPOCoef = dict(zip(cofNames,np.zeros(len(cofNames)))) 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 += ', Vol = {:.3f}'.format(G2lat.calc_V(newA)) 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): 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() 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',] # remove 'Secondary Type I & II' 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) 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) 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'] 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) val2Sizer.Add(Eref,0,WACV|wx.LEFT,5) Eval = G2G.ValidatedTxtCtrl(DData,UseList[G2frame.hist]['Extinction'][2][ekey],0, xmin=0.,nDig=(10,3,'g'),typeHint=float) val2Sizer.Add(Eval,0,WACV) extSizer.Add(val2Sizer,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 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): if not UseList[G2frame.hist]['LeBail']: Controls['newLeBail'] = True else: Controls['newLeBail'] = False UseList[G2frame.hist]['LeBail'] = not UseList[G2frame.hist]['LeBail'] 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 'LeBail' not in UseList[G2frame.hist]: UseList[G2frame.hist]['LeBail'] = False 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 '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 '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) 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 not UseList[G2frame.hist]['LeBail'] or 'HKLF' in G2frame.hist[:4]: bottomSizer.Add(ScaleSizer(),0,wx.BOTTOM,5) 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'),0,wx.TOP|wx.BOTTOM,5) if generalData['Type'] != 'magnetic': bottomSizer.Add(BabSizer(),0,wx.BOTTOM,5) elif G2frame.hist[:4] == 'HKLF': bottomSizer.Add(ExtSizer('HKLF')) #,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 = wx.BoxSizer(wx.HORIZONTAL) topSizer.Add(wx.StaticText(DData,wx.ID_ANY,' Histogram data for Phase '+PhaseName+':'),0,wx.LEFT,5) # add help button to bring up help web page - at right sede of window topSizer.Add((-1,-1),1,wx.EXPAND) topSizer.Add(G2G.HelpButton(DData,helpIndex=G2frame.dataWindow.helpKey)) mainSizer.Add(topSizer,0,wx.EXPAND) 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 info from Hist/Phase tree item (not used with Phase/Data tab) ''' 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 (note similar routines in GSASIIphsGUI.py) def OnHklfAdd(event): data = getDDataPhaseinfo() keyList = data['Histograms'].keys() TextList = [] if not G2frame.GPXtree.GetCount(): return item, cookie = G2frame.GPXtree.GetFirstChild(G2frame.root) while item: name = G2frame.GPXtree.GetItemText(item) if name not in keyList and 'HKLF' in name: TextList.append(name) item, cookie = G2frame.GPXtree.GetNextChild(G2frame.root, cookie) if not TextList: G2G.G2MessageBox(G2frame,'No reflections') return dlg = G2G.G2MultiChoiceDialog(G2frame, 'Select reflection sets to use', 'Use data',TextList) try: if dlg.ShowModal() == wx.ID_OK: result = dlg.GetSelections() else: return finally: dlg.Destroy() # get the histograms used in other phases phaseRIdList,usedHistograms = G2frame.GetPhaseInfofromTree() usedHKLFhists = [] # used single-crystal histograms for p in usedHistograms: for h in usedHistograms[p]: if h.startswith('HKLF ') and h not in usedHKLFhists: usedHKLFhists.append(h) # check that selected single crystal histograms are not already in use! for i in result: used = [TextList[i] for i in result if TextList[i] in usedHKLFhists] if used: msg = 'The following single crystal histogram(s) are already in use' for i in used: msg += '\n '+str(i) msg += '\nAre you sure you want to add them to this phase? ' msg += 'Associating a single crystal dataset to >1 histogram is usually an error, ' msg += 'so No is suggested here.' if G2frame.ErrorDialog('Likely error',msg,G2frame,wtype=wx.YES_NO) != wx.ID_YES: return wx.BeginBusyCursor() for i in result: histoName = TextList[i] Id = G2gd.GetGPXtreeItemId(G2frame,G2frame.root,histoName) refDict,reflData = G2frame.GPXtree.GetItemPyData(Id) data['Histograms'][histoName] = {'Histogram':histoName,'Show':False,'Scale':[1.0,True], 'Babinet':{'BabA':[0.0,False],'BabU':[0.0,False]}, 'Extinction':['Lorentzian','None', {'Tbar':0.1,'Cos2TM':0.955,'Eg':[1.e-7,False],'Es':[1.e-7,False],'Ep':[1.e-7,False]},], 'Flack':[0.0,False],'Twins':[[np.array([[1,0,0],[0,1,0],[0,0,1]]),[1.0,False,0]],]} if 'TwMax' in reflData: #nonmerohedral twins present data['Histograms'][histoName]['Twins'] = [] for iT in range(reflData['TwMax'][0]+1): if iT in reflData['TwMax'][1]: data['Histograms'][histoName]['Twins'].append([False,0.0]) else: data['Histograms'][histoName]['Twins'].append([np.array([[1,0,0],[0,1,0],[0,0,1]]),[1.0,False,reflData['TwMax'][0]]]) else: #no nonmerohedral twins data['Histograms'][histoName]['Twins'] = [[np.array([[1,0,0],[0,1,0],[0,0,1]]),[1.0,False,0]],] UpdateHKLFdata(histoName) wx.CallAfter(UpdateDData,G2frame,getDDataWindow(),data) wx.EndBusyCursor() 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 UpdateHKLFdata(histoName): data = getDDataPhaseinfo() generalData = data['General'] Id = G2gd.GetGPXtreeItemId(G2frame,G2frame.root,histoName) refDict,reflData = G2frame.GPXtree.GetItemPyData(Id) SGData = generalData['SGData'] Cell = generalData['Cell'][1:7] G,g = G2lat.cell2Gmat(Cell) for iref,ref in enumerate(reflData['RefList']): H = list(ref[:3]) ref[4] = np.sqrt(1./G2lat.calc_rDsq2(H,G)) iabsnt,ref[3],Uniq,phi = G2spc.GenHKLf(H,SGData) 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 G2frame.dataWindow.ClearData() HAPBook = G2G.GSNoteBook(parent=G2frame.dataWindow) G2frame.dataWindow.GetSizer().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) # 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)