source: branch/2frame/GSASIIddataGUI.py @ 2917

Last change on this file since 2917 was 2917, checked in by toby, 4 years ago

massive changes of wxID_ ids & misc to fix undefined vars wanings

  • Property svn:eol-style set to native
  • Property svn:keywords set to Date Author Revision URL Id
File size: 46.9 KB
Line 
1# -*- coding: utf-8 -*-
2#GSASII - phase data display routines
3########### SVN repository information ###################
4# $Date: 2017-07-07 21:45:18 +0000 (Fri, 07 Jul 2017) $
5# $Author: toby $
6# $Revision: 2917 $
7# $URL: branch/2frame/GSASIIddataGUI.py $
8# $Id: GSASIIddataGUI.py 2917 2017-07-07 21:45:18Z toby $
9########### SVN repository information ###################
10'''
11*GSASIIddataGUI: Phase Diffraction Data GUI*
12--------------------------------------------
13
14Module to create the GUI for display of diffraction data * phase
15information that is shown in the data display window
16(when a phase is selected.)
17
18'''
19import wx
20import GSASIIpath
21GSASIIpath.SetVersionNumber("$Revision: 2917 $")
22import GSASIIlattice as G2lat
23import GSASIIspc as G2spc
24import GSASIIplot as G2plt
25import GSASIIdataGUI as G2gd
26import GSASIIpwd as G2pwd
27import GSASIIphsGUI as G2phsGUI
28import GSASIIctrlGUI as G2G
29import numpy as np
30
31WACV = wx.ALIGN_CENTER_VERTICAL
32VERY_LIGHT_GREY = wx.Colour(235,235,235)
33WHITE = wx.Colour(255,255,255)
34BLACK = wx.Colour(0,0,0)
35mapDefault = {'MapType':'','RefList':'','Resolution':0.5,'Show bonds':True,
36                'rho':[],'rhoMax':0.,'mapSize':10.0,'cutOff':50.,'Flip':False}
37
38################################################################################
39##### DData routines
40################################################################################       
41def UpdateDData(G2frame,DData,data,hist='',Scroll=0):
42    '''Display the Diffraction Data associated with a phase
43    (items where there is a value for each histogram and phase)
44
45    :param wx.frame G2frame: the main GSAS-II frame object
46    :param wx.ScrolledWindow DData: notebook page to be used for the display
47    :param dict data: all the information on the phase in a dictionary
48    :param str hist: histogram name
49    :param int Scroll: previous scroll position
50
51    '''
52    def PlotSizer():
53
54        def OnPlotSel(event):
55            Obj = event.GetEventObject()
56            generalData['Data plot type'] = Obj.GetStringSelection()
57            G2plt.PlotSizeStrainPO(G2frame,data,G2frame.hist)
58            wx.CallLater(100,UpdateDData,G2frame,DData,data,G2frame.hist)
59           
60        def OnPOhkl(event):
61            event.Skip()
62            Obj = event.GetEventObject()
63            Saxis = Obj.GetValue().split()
64            try:
65                hkl = [int(Saxis[i]) for i in range(3)]
66            except (ValueError,IndexError):
67                hkl = generalData['POhkl']
68            if not np.any(np.array(hkl)):
69                hkl = generalData['POhkl']
70            generalData['POhkl'] = hkl
71            h,k,l = hkl
72            Obj.SetValue('%3d %3d %3d'%(h,k,l)) 
73            G2plt.PlotSizeStrainPO(G2frame,data,G2frame.hist)
74       
75        plotSizer = wx.BoxSizer(wx.VERTICAL)
76        choice = ['None','Mustrain','Size','Preferred orientation','Inv. pole figure']
77        plotSel = wx.RadioBox(DData,wx.ID_ANY,'Select plot type:',choices=choice,
78            majorDimension=1,style=wx.RA_SPECIFY_COLS)
79        plotSel.SetStringSelection(generalData['Data plot type'])
80        plotSel.Bind(wx.EVT_RADIOBOX,OnPlotSel)   
81        plotSizer.Add(plotSel)
82        if generalData['Data plot type'] == 'Preferred orientation':
83            POhklSizer = wx.BoxSizer(wx.HORIZONTAL)
84            POhklSizer.Add(wx.StaticText(DData,wx.ID_ANY,' Plot preferred orientation for H K L: '),0,WACV)
85            h,k,l = generalData['POhkl']
86            poAxis = wx.TextCtrl(DData,wx.ID_ANY,'%3d %3d %3d'%(h,k,l),style=wx.TE_PROCESS_ENTER)
87            poAxis.Bind(wx.EVT_TEXT_ENTER,OnPOhkl)
88            poAxis.Bind(wx.EVT_KILL_FOCUS,OnPOhkl)
89            POhklSizer.Add(poAxis,0,WACV)
90            plotSizer.Add(POhklSizer)
91        elif generalData['Data plot type'] == 'Inv. pole figure':
92            pass    #might need something here?     
93        return plotSizer
94       
95    def ScaleSizer():
96       
97        def OnScaleRef(event):
98            Obj = event.GetEventObject()
99            UseList[G2frame.hist]['Scale'][1] = Obj.GetValue()
100           
101        scaleSizer = wx.BoxSizer(wx.HORIZONTAL)
102        if 'PWDR' in G2frame.hist:
103            scaleRef = wx.CheckBox(DData,wx.ID_ANY,label=' Phase fraction: ')
104        elif 'HKLF' in G2frame.hist:
105            scaleRef = wx.CheckBox(DData,wx.ID_ANY,label=' Scale factor: ')               
106        scaleRef.SetValue(UseList[G2frame.hist]['Scale'][1])
107        scaleRef.Bind(wx.EVT_CHECKBOX, OnScaleRef)
108        scaleSizer.Add(scaleRef,0,WACV|wx.LEFT,5)
109        scaleVal = G2G.ValidatedTxtCtrl(DData,UseList[G2frame.hist]['Scale'],0,
110            min=0.,nDig=(10,4),typeHint=float)
111        scaleSizer.Add(scaleVal,0,WACV)
112        if 'PWDR' in G2frame.hist and generalData['Type'] != 'magnetic':
113            wtSum = G2pwd.PhaseWtSum(G2frame,G2frame.hist)
114            weightFr = UseList[G2frame.hist]['Scale'][0]*generalData['Mass']/wtSum
115            scaleSizer.Add(wx.StaticText(DData,label=' Wt. fraction: %.3f'%(weightFr)),0,WACV)
116        return scaleSizer
117       
118    def OnLGmixRef(event):
119        Obj = event.GetEventObject()
120        hist,name = Indx[Obj.GetId()]
121        UseList[G2frame.hist][name][2][2] = Obj.GetValue()
122       
123    def OnLGmixVal(event):
124        event.Skip()
125        Obj = event.GetEventObject()
126        hist,name = Indx[Obj.GetId()]
127        try:
128            value = float(Obj.GetValue())
129            UseList[G2frame.hist][name][1][2] = value
130#            if 0 <= value <= 1:
131#                UseList[G2frame.hist][name][1][2] = value
132#            else:
133#                raise ValueError
134        except ValueError:
135            pass
136        Obj.SetValue("%.4f"%(UseList[G2frame.hist][name][1][2]))          #reset in case of error
137
138    def OnSizeType(event):
139        Obj = event.GetEventObject()
140        UseList[G2frame.hist]['Size'][0] = Obj.GetValue()
141        G2plt.PlotSizeStrainPO(G2frame,data,G2frame.hist)
142        wx.CallLater(100,RepaintHistogramInfo,DData.GetScrollPos(wx.VERTICAL))
143       
144    def OnSizeRef(event):
145        Obj = event.GetEventObject()
146        hist,pid = Indx[Obj.GetId()]
147        if UseList[G2frame.hist]['Size'][0] == 'ellipsoidal':
148            UseList[G2frame.hist]['Size'][5][pid] = Obj.GetValue()               
149        else:
150            UseList[G2frame.hist]['Size'][2][pid] = Obj.GetValue()
151       
152    def OnSizeVal(event):
153        event.Skip()
154        Obj = event.GetEventObject()
155        hist,pid = Indx[Obj.GetId()]
156        if UseList[G2frame.hist]['Size'][0] == 'ellipsoidal':
157            try:
158                size = float(Obj.GetValue())
159                if pid < 3 and size <= 0.001:            #10A lower limit!
160                    raise ValueError
161                UseList[G2frame.hist]['Size'][4][pid] = size                   
162            except ValueError:
163                pass
164            Obj.SetValue("%.5f"%(UseList[G2frame.hist]['Size'][4][pid]))          #reset in case of error
165        else:
166            try:
167                size = float(Obj.GetValue())
168                if size <= 0.001:            #10A lower limit!
169                    raise ValueError
170                UseList[G2frame.hist]['Size'][1][pid] = size
171            except ValueError:
172                pass
173            Obj.SetValue("%.5f"%(UseList[G2frame.hist]['Size'][1][pid]))          #reset in case of error
174        wx.CallAfter(G2plt.PlotSizeStrainPO,G2frame,data,hist)
175       
176    def OnStrainType(event):
177        Obj = event.GetEventObject()
178        UseList[G2frame.hist]['Mustrain'][0] = Obj.GetValue()
179        G2plt.PlotSizeStrainPO(G2frame,data,G2frame.hist)
180        wx.CallLater(100,RepaintHistogramInfo,DData.GetScrollPos(wx.VERTICAL))
181       
182    def OnStrainRef(event):
183        Obj = event.GetEventObject()
184        hist,pid = Indx[Obj.GetId()]
185        if UseList[G2frame.hist]['Mustrain'][0] == 'generalized':
186            UseList[G2frame.hist]['Mustrain'][5][pid] = Obj.GetValue()
187        else:
188            UseList[G2frame.hist]['Mustrain'][2][pid] = Obj.GetValue()
189       
190    def OnStrainVal(event):
191        event.Skip()
192        Snames = G2spc.MustrainNames(SGData)
193        Obj = event.GetEventObject()
194        hist,pid = Indx[Obj.GetId()]
195        try:
196            strain = float(Obj.GetValue())
197            if UseList[G2frame.hist]['Mustrain'][0] == 'generalized':
198                if '4' in Snames[pid] and strain < 0:
199                    raise ValueError
200                UseList[G2frame.hist]['Mustrain'][4][pid] = strain
201            else:
202                if strain <= 0:
203                    raise ValueError
204                UseList[G2frame.hist]['Mustrain'][1][pid] = strain
205        except ValueError:
206            pass
207        if UseList[G2frame.hist]['Mustrain'][0] == 'generalized':
208            Obj.SetValue("%.1f"%(UseList[G2frame.hist]['Mustrain'][4][pid]))          #reset in case of error
209        else:
210            Obj.SetValue("%.1f"%(UseList[G2frame.hist]['Mustrain'][1][pid]))          #reset in case of error
211        wx.CallAfter(G2plt.PlotSizeStrainPO,G2frame,data,hist)
212       
213    def OnStrainAxis(event):
214        event.Skip()
215        Obj = event.GetEventObject()
216        Saxis = Obj.GetValue().split()
217        try:
218            hkl = [int(Saxis[i]) for i in range(3)]
219        except (ValueError,IndexError):
220            hkl = UseList[G2frame.hist]['Mustrain'][3]
221        if not np.any(np.array(hkl)):
222            hkl = UseList[G2frame.hist]['Mustrain'][3]
223        UseList[G2frame.hist]['Mustrain'][3] = hkl
224        h,k,l = hkl
225        Obj.SetValue('%3d %3d %3d'%(h,k,l)) 
226        G2plt.PlotSizeStrainPO(G2frame,data,G2frame.hist)
227       
228    def OnResetStrain(event):
229        Obj = event.GetEventObject()
230        Obj.SetValue(False)
231        item,name = Indx[Obj.GetId()]
232        if name == 'isotropic':
233            UseList[item]['Mustrain'][1][0] = 1000.0
234        elif name == 'uniaxial':
235            UseList[item]['Mustrain'][1][0] = 1000.0
236            UseList[item]['Mustrain'][1][1] = 1000.0
237        elif name == 'generalized':
238            muiso = 1000.
239            cell = generalData['Cell'][1:7]
240            vals = G2spc.Muiso2Shkl(muiso,SGData,cell)
241            nTerm = len(UseList[item]['Mustrain'][4])
242            for i in range(nTerm):
243                UseList[item]['Mustrain'][4][i] = vals[i]
244        G2plt.PlotSizeStrainPO(G2frame,data,item)
245        wx.CallLater(100,RepaintHistogramInfo,DData.GetScrollPos(wx.VERTICAL))
246           
247    def OnHstrainRef(event):
248        Obj = event.GetEventObject()
249        hist,pid = Indx[Obj.GetId()]
250        UseList[G2frame.hist]['HStrain'][1][pid] = Obj.GetValue()
251       
252    def OnHstrainVal(event):
253        event.Skip()
254        Obj = event.GetEventObject()
255        hist,pid = Indx[Obj.GetId()]
256        try:
257            strain = float(Obj.GetValue())
258            UseList[G2frame.hist]['HStrain'][0][pid] = strain
259        except ValueError:
260            pass
261        Obj.SetValue("%.3g"%(UseList[G2frame.hist]['HStrain'][0][pid]))          #reset in case of error
262
263    def OnPOAxis(event):
264        event.Skip()
265        Obj = event.GetEventObject()
266        Saxis = Obj.GetValue().split()
267        try:
268            hkl = [int(Saxis[i]) for i in range(3)]
269        except (ValueError,IndexError):
270            hkl = UseList[G2frame.hist]['Pref.Ori.'][3]
271        if not np.any(np.array(hkl)):
272            hkl = UseList[G2frame.hist]['Pref.Ori.'][3]
273        UseList[G2frame.hist]['Pref.Ori.'][3] = hkl
274        h,k,l = hkl
275        Obj.SetValue('%3d %3d %3d'%(h,k,l)) 
276       
277    def OnPOOrder(event):
278        Obj = event.GetEventObject()
279        Order = int(Obj.GetValue())
280        UseList[G2frame.hist]['Pref.Ori.'][4] = Order
281        UseList[G2frame.hist]['Pref.Ori.'][5] = SetPOCoef(Order,G2frame.hist)
282        wx.CallLater(100,RepaintHistogramInfo,DData.GetScrollPos(wx.VERTICAL))
283
284    def OnPOType(event):
285        Obj = event.GetEventObject()
286        if 'March' in Obj.GetValue():
287            UseList[G2frame.hist]['Pref.Ori.'][0] = 'MD'
288        else:
289            UseList[G2frame.hist]['Pref.Ori.'][0] = 'SH'
290        wx.CallLater(100,RepaintHistogramInfo,DData.GetScrollPos(wx.VERTICAL))
291
292    def OnPORef(event):
293        Obj = event.GetEventObject()
294        UseList[G2frame.hist]['Pref.Ori.'][2] = Obj.GetValue()
295           
296    def SetPOCoef(Order,hist):
297        cofNames = G2lat.GenSHCoeff(SGData['SGLaue'],'0',Order,False)     #cylindrical & no M
298        newPOCoef = dict(zip(cofNames,np.zeros(len(cofNames))))
299        POCoeff = UseList[G2frame.hist]['Pref.Ori.'][5]
300        for cofName in POCoeff:
301            if cofName in  cofNames:
302                newPOCoef[cofName] = POCoeff[cofName]
303        return newPOCoef
304       
305    def checkAxis(axis):
306        if not np.any(np.array(axis)):
307            return False
308        return axis
309       
310    def TopSizer(name,choices,parm,OnType):
311        topSizer = wx.BoxSizer(wx.HORIZONTAL)
312        topSizer.Add(wx.StaticText(DData,wx.ID_ANY,name),0,WACV)
313        sizeType = wx.ComboBox(DData,wx.ID_ANY,value=UseList[G2frame.hist][parm][0],choices=choices,
314            style=wx.CB_READONLY|wx.CB_DROPDOWN)
315        sizeType.Bind(wx.EVT_COMBOBOX, OnType)
316        topSizer.Add(sizeType,0,WACV|wx.BOTTOM,5)
317        return topSizer
318       
319    def LGmixSizer(name,OnVal,OnRef):
320        lgmixSizer = wx.BoxSizer(wx.HORIZONTAL)
321        lgmixRef = wx.CheckBox(DData,wx.ID_ANY,label='LGmix')
322        lgmixRef.thisown = False
323        lgmixRef.SetValue(UseList[G2frame.hist][name][2][2])
324        Indx[lgmixRef.GetId()] = [G2frame.hist,name]
325        lgmixRef.Bind(wx.EVT_CHECKBOX, OnRef)
326        lgmixSizer.Add(lgmixRef,0,WACV|wx.LEFT,5)
327#        azmthOff = G2G.ValidatedTxtCtrl(G2frame.dataDisplay,data,'azmthOff',nDig=(10,2),typeHint=float,OnLeave=OnAzmthOff)
328        lgmixVal = wx.TextCtrl(DData,wx.ID_ANY,
329            '%.4f'%(UseList[G2frame.hist][name][1][2]),style=wx.TE_PROCESS_ENTER)
330        Indx[lgmixVal.GetId()] = [G2frame.hist,name]
331        lgmixVal.Bind(wx.EVT_TEXT_ENTER,OnVal)
332        lgmixVal.Bind(wx.EVT_KILL_FOCUS,OnVal)
333        lgmixSizer.Add(lgmixVal,0,WACV|wx.LEFT,5)
334        return lgmixSizer
335                   
336    def ResetSizer(name,OnReset):
337        resetSizer = wx.BoxSizer(wx.HORIZONTAL)
338        reset = wx.CheckBox(DData,wx.ID_ANY,label='Reset?')
339        reset.thisown = False
340        reset.SetValue(False)
341        Indx[reset.GetId()] = [G2frame.hist,name]
342        reset.Bind(wx.EVT_CHECKBOX,OnReset)
343        resetSizer.Add(reset,0,WACV|wx.TOP|wx.LEFT,5)
344        return resetSizer
345       
346    def IsoSizer(name,parm,fmt,OnVal,OnRef):
347        isoSizer = wx.BoxSizer(wx.HORIZONTAL)
348        sizeRef = wx.CheckBox(DData,wx.ID_ANY,label=name)
349        sizeRef.thisown = False
350        sizeRef.SetValue(UseList[G2frame.hist][parm][2][0])
351        Indx[sizeRef.GetId()] = [G2frame.hist,0]
352        sizeRef.Bind(wx.EVT_CHECKBOX, OnRef)
353        isoSizer.Add(sizeRef,0,WACV|wx.LEFT,5)
354#        azmthOff = G2G.ValidatedTxtCtrl(G2frame.dataDisplay,data,'azmthOff',nDig=(10,2),typeHint=float,OnLeave=OnAzmthOff)
355        sizeVal = wx.TextCtrl(DData,wx.ID_ANY,
356            fmt%(UseList[G2frame.hist][parm][1][0]),style=wx.TE_PROCESS_ENTER)
357        Indx[sizeVal.GetId()] = [G2frame.hist,0]
358        sizeVal.Bind(wx.EVT_TEXT_ENTER,OnVal)
359        sizeVal.Bind(wx.EVT_KILL_FOCUS,OnVal)
360        isoSizer.Add(sizeVal,0,WACV)
361        return isoSizer
362       
363    def UniSizer(parm,OnAxis):
364        uniSizer = wx.BoxSizer(wx.HORIZONTAL)
365        uniSizer.Add(wx.StaticText(DData,wx.ID_ANY,' Unique axis, H K L: '),0,WACV)
366        h,k,l = UseList[G2frame.hist][parm][3]
367        Axis = wx.TextCtrl(DData,wx.ID_ANY,'%3d %3d %3d'%(h,k,l),style=wx.TE_PROCESS_ENTER)
368        Axis.Bind(wx.EVT_TEXT_ENTER,OnAxis)
369        Axis.Bind(wx.EVT_KILL_FOCUS,OnAxis)
370        uniSizer.Add(Axis,0,WACV|wx.LEFT,5)
371        return uniSizer
372       
373    def UniDataSizer(parmName,parm,fmt,OnVal,OnRef):
374        dataSizer = wx.BoxSizer(wx.HORIZONTAL)
375        parms = zip([' Equatorial '+parmName,' Axial '+parmName],
376            UseList[G2frame.hist][parm][1],UseList[G2frame.hist][parm][2],range(2))
377        for Pa,val,ref,id in parms:
378            sizeRef = wx.CheckBox(DData,wx.ID_ANY,label=Pa)
379            sizeRef.thisown = False
380            sizeRef.SetValue(ref)
381            Indx[sizeRef.GetId()] = [G2frame.hist,id]
382            sizeRef.Bind(wx.EVT_CHECKBOX, OnRef)
383            dataSizer.Add(sizeRef,0,WACV|wx.LEFT,5)
384#        azmthOff = G2G.ValidatedTxtCtrl(G2frame.dataDisplay,data,'azmthOff',nDig=(10,2),typeHint=float,OnLeave=OnAzmthOff)
385            sizeVal = wx.TextCtrl(DData,wx.ID_ANY,fmt%(val),style=wx.TE_PROCESS_ENTER)
386            Indx[sizeVal.GetId()] = [G2frame.hist,id]
387            sizeVal.Bind(wx.EVT_TEXT_ENTER,OnVal)
388            sizeVal.Bind(wx.EVT_KILL_FOCUS,OnVal)
389            dataSizer.Add(sizeVal,0,WACV|wx.BOTTOM,5)
390        return dataSizer
391       
392    def EllSizeDataSizer():
393        parms = zip(['S11','S22','S33','S12','S13','S23'],UseList[G2frame.hist]['Size'][4],
394            UseList[G2frame.hist]['Size'][5],range(6))
395        dataSizer = wx.FlexGridSizer(0,6,5,5)
396        for Pa,val,ref,id in parms:
397            sizeRef = wx.CheckBox(DData,wx.ID_ANY,label=Pa)
398            sizeRef.thisown = False
399            sizeRef.SetValue(ref)
400            Indx[sizeRef.GetId()] = [G2frame.hist,id]
401            sizeRef.Bind(wx.EVT_CHECKBOX, OnSizeRef)
402            dataSizer.Add(sizeRef,0,WACV)
403#        azmthOff = G2G.ValidatedTxtCtrl(G2frame.dataDisplay,data,'azmthOff',nDig=(10,2),typeHint=float,OnLeave=OnAzmthOff)
404            sizeVal = wx.TextCtrl(DData,wx.ID_ANY,'%.3f'%(val),style=wx.TE_PROCESS_ENTER)
405            Indx[sizeVal.GetId()] = [G2frame.hist,id]
406            sizeVal.Bind(wx.EVT_TEXT_ENTER,OnSizeVal)
407            sizeVal.Bind(wx.EVT_KILL_FOCUS,OnSizeVal)
408            dataSizer.Add(sizeVal,0,WACV)
409        return dataSizer
410       
411    def GenStrainDataSizer():
412        Snames = G2spc.MustrainNames(SGData)
413        numb = len(Snames)
414        if len(UseList[G2frame.hist]['Mustrain'][4]) < numb:
415            UseList[G2frame.hist]['Mustrain'][4] = numb*[0.0,]
416            UseList[G2frame.hist]['Mustrain'][5] = numb*[False,]
417        parms = zip(Snames,UseList[G2frame.hist]['Mustrain'][4],UseList[G2frame.hist]['Mustrain'][5],range(numb))
418        dataSizer = wx.FlexGridSizer(0,6,5,5)
419        for Pa,val,ref,id in parms:
420            strainRef = wx.CheckBox(DData,wx.ID_ANY,label=Pa)
421            strainRef.thisown = False
422            strainRef.SetValue(ref)
423            Indx[strainRef.GetId()] = [G2frame.hist,id]
424            strainRef.Bind(wx.EVT_CHECKBOX, OnStrainRef)
425            dataSizer.Add(strainRef,0,WACV)
426#        azmthOff = G2G.ValidatedTxtCtrl(G2frame.dataDisplay,data,'azmthOff',nDig=(10,2),typeHint=float,OnLeave=OnAzmthOff)
427            strainVal = wx.TextCtrl(DData,wx.ID_ANY,'%.1f'%(val),style=wx.TE_PROCESS_ENTER)
428            Indx[strainVal.GetId()] = [G2frame.hist,id]
429            strainVal.Bind(wx.EVT_TEXT_ENTER,OnStrainVal)
430            strainVal.Bind(wx.EVT_KILL_FOCUS,OnStrainVal)
431            dataSizer.Add(strainVal,0,WACV)
432        return dataSizer
433
434    def HstrainSizer():
435        hstrainSizer = wx.FlexGridSizer(0,6,5,5)
436        Hsnames = G2spc.HStrainNames(SGData)
437        parms = zip(Hsnames,UseList[G2frame.hist]['HStrain'][0],UseList[G2frame.hist]['HStrain'][1],range(len(Hsnames)))
438        for Pa,val,ref,id in parms:
439            hstrainRef = wx.CheckBox(DData,wx.ID_ANY,label=Pa)
440            hstrainRef.thisown = False
441            hstrainRef.SetValue(ref)
442            Indx[hstrainRef.GetId()] = [G2frame.hist,id]
443            hstrainRef.Bind(wx.EVT_CHECKBOX, OnHstrainRef)
444            hstrainSizer.Add(hstrainRef,0,WACV|wx.LEFT,5)
445#        azmthOff = G2G.ValidatedTxtCtrl(G2frame.dataDisplay,data,'azmthOff',nDig=(10,2),typeHint=float,OnLeave=OnAzmthOff)
446            hstrainVal = wx.TextCtrl(DData,wx.ID_ANY,'%.3g'%(val),style=wx.TE_PROCESS_ENTER)
447            Indx[hstrainVal.GetId()] = [G2frame.hist,id]
448            hstrainVal.Bind(wx.EVT_TEXT_ENTER,OnHstrainVal)
449            hstrainVal.Bind(wx.EVT_KILL_FOCUS,OnHstrainVal)
450            hstrainSizer.Add(hstrainVal,0,WACV)
451        return hstrainSizer
452       
453    def PoTopSizer(POData):
454        poSizer = wx.FlexGridSizer(0,6,5,5)
455        choice = ['March-Dollase','Spherical harmonics']
456        POtype = choice[['MD','SH'].index(POData[0])]
457        poSizer.Add(wx.StaticText(DData,wx.ID_ANY,' Preferred orientation model '),0,WACV)
458        POType = wx.ComboBox(DData,wx.ID_ANY,value=POtype,choices=choice,
459            style=wx.CB_READONLY|wx.CB_DROPDOWN)
460        POType.Bind(wx.EVT_COMBOBOX, OnPOType)
461        poSizer.Add(POType)
462        if POData[0] == 'SH':
463            poSizer.Add(wx.StaticText(DData,wx.ID_ANY,' Harmonic order: '),0,WACV)
464            poOrder = wx.ComboBox(DData,wx.ID_ANY,value=str(POData[4]),choices=[str(2*i) for i in range(18)],
465                style=wx.CB_READONLY|wx.CB_DROPDOWN)
466            poOrder.Bind(wx.EVT_COMBOBOX,OnPOOrder)
467            poSizer.Add(poOrder,0,WACV)
468            poRef = wx.CheckBox(DData,wx.ID_ANY,label=' Refine? ')
469            poRef.SetValue(POData[2])
470            poRef.Bind(wx.EVT_CHECKBOX,OnPORef)
471            poSizer.Add(poRef,0,WACV)
472        return poSizer
473       
474    def MDDataSizer(POData):
475        poSizer = wx.BoxSizer(wx.HORIZONTAL)
476        poRef = wx.CheckBox(DData,wx.ID_ANY,label=' March-Dollase ratio: ')
477        poRef.SetValue(POData[2])
478        poRef.Bind(wx.EVT_CHECKBOX,OnPORef)
479        poSizer.Add(poRef,0,WACV|wx.LEFT,5)
480        poVal = G2G.ValidatedTxtCtrl(DData,POData,1,nDig=(10,3),typeHint=float,min=0.)
481        poSizer.Add(poVal,0,WACV)
482        poSizer.Add(wx.StaticText(DData,wx.ID_ANY,' Unique axis, H K L: '),0,WACV)
483        h,k,l =POData[3]
484        poAxis = wx.TextCtrl(DData,wx.ID_ANY,'%3d %3d %3d'%(h,k,l),style=wx.TE_PROCESS_ENTER)
485        poAxis.Bind(wx.EVT_TEXT_ENTER,OnPOAxis)
486        poAxis.Bind(wx.EVT_KILL_FOCUS,OnPOAxis)
487        poSizer.Add(poAxis,0,WACV)
488        return poSizer
489       
490    def SHDataSizer(POData):
491       
492        def OnODFValue(invalid,value,tc):
493            G2plt.PlotSizeStrainPO(G2frame,data,G2frame.hist)
494   
495        ODFSizer = wx.FlexGridSizer(0,8,2,2)
496        ODFkeys = POData[5].keys()
497        ODFkeys.sort()
498        for odf in ODFkeys:
499            ODFSizer.Add(wx.StaticText(DData,wx.ID_ANY,odf),0,WACV)
500            ODFval = G2G.ValidatedTxtCtrl(DData,POData[5],odf,nDig=(8,3),typeHint=float,OnLeave=OnODFValue)
501            ODFSizer.Add(ODFval,0,WACV|wx.LEFT,5)
502        return ODFSizer
503       
504    def SHPenalty(POData):
505       
506        def OnHKLList(event):
507            dlg = G2G.G2MultiChoiceDialog(G2frame, 'Select penalty hkls',
508                'Penalty hkls',hkls,filterBox=False)
509            try:
510                if dlg.ShowModal() == wx.ID_OK:
511                    POData[6] = [hkls[i] for i in dlg.GetSelections()]
512                    if not POData[6]:
513                        POData[6] = ['',]
514                else:
515                    return
516            finally:
517                dlg.Destroy()
518            wx.CallLater(100,RepaintHistogramInfo,DData.GetScrollPos(wx.VERTICAL))
519           
520        A = G2lat.cell2A(generalData['Cell'][1:7])
521        hkls = G2lat.GenPfHKLs(10,SGData,A)   
522        shPenalty = wx.BoxSizer(wx.HORIZONTAL)
523        shPenalty.Add(wx.StaticText(DData,wx.ID_ANY,' Negative MRD penalty list: '),0,WACV)
524        shPenalty.Add(wx.ComboBox(DData,value=POData[6][0],choices=POData[6],
525            style=wx.CB_DROPDOWN),0,WACV|wx.LEFT,5)
526        hklList = wx.Button(DData,label='Select penalty hkls')
527        hklList.Bind(wx.EVT_BUTTON,OnHKLList)
528        shPenalty.Add(hklList,0,WACV)
529        shPenalty.Add(wx.StaticText(DData,wx.ID_ANY,' Zero MRD tolerance: '),0,WACV)
530        shToler = G2G.ValidatedTxtCtrl(DData,POData,7,nDig=(10,2),typeHint=float)
531        shPenalty.Add(shToler,0,WACV)
532        return shPenalty   
533       
534    def ExtSizer(Type):
535       
536        def OnSCExtType(event):
537            Obj = event.GetEventObject()
538            item = Indx[Obj.GetId()]
539            UseList[item[0]]['Extinction'][item[1]] = Obj.GetValue()
540            wx.CallLater(100,RepaintHistogramInfo,DData.GetScrollPos(wx.VERTICAL))
541               
542        def OnEref(event):
543            Obj = event.GetEventObject()
544            item = Indx[Obj.GetId()]
545            UseList[item[0]]['Extinction'][2][item[1]][1] = Obj.GetValue()
546   
547        def OnExtRef(event):
548            Obj = event.GetEventObject()
549            UseList[G2frame.hist]['Extinction'][1] = Obj.GetValue()
550           
551        if Type == 'HKLF':
552            extSizer = wx.BoxSizer(wx.VERTICAL)
553            typeSizer = wx.BoxSizer(wx.HORIZONTAL)           
554            typeSizer.Add(wx.StaticText(DData,wx.ID_ANY,' Extinction type: '),0,WACV)
555            Choices = ['None','Primary','Secondary Type I','Secondary Type II',]    # remove 'Secondary Type I & II'
556            typeTxt = wx.ComboBox(DData,wx.ID_ANY,choices=Choices,value=UseList[G2frame.hist]['Extinction'][1],
557                style=wx.CB_READONLY|wx.CB_DROPDOWN)
558            Indx[typeTxt.GetId()] = [G2frame.hist,1]
559            typeTxt.Bind(wx.EVT_COMBOBOX,OnSCExtType)
560            typeSizer.Add(typeTxt)
561            typeSizer.Add(wx.StaticText(DData,wx.ID_ANY,' Approx: '),0,WACV)
562            Choices=['Lorentzian','Gaussian']
563            approxTxT = wx.ComboBox(DData,wx.ID_ANY,choices=Choices,value=UseList[G2frame.hist]['Extinction'][0],
564                style=wx.CB_READONLY|wx.CB_DROPDOWN)
565            Indx[approxTxT.GetId()] = [G2frame.hist,0]
566            approxTxT.Bind(wx.EVT_COMBOBOX,OnSCExtType)
567            typeSizer.Add(approxTxT)
568            if UseList[G2frame.hist]['Extinction'][1] == 'None':
569                extSizer.Add(typeSizer,0,WACV)
570            else:
571                extSizer.Add(typeSizer,0,WACV|wx.BOTTOM,5)       
572                if 'Tbar' in UseList[G2frame.hist]['Extinction'][2]:       #skipped for TOF   
573                    valSizer =wx.BoxSizer(wx.HORIZONTAL)
574                    valSizer.Add(wx.StaticText(DData,wx.ID_ANY,' Tbar(mm):'),0,WACV)
575                    tbarVal = G2G.ValidatedTxtCtrl(DData,UseList[G2frame.hist]['Extinction'][2],'Tbar',
576                        min=0.,nDig=(10,3),typeHint=float)
577                    valSizer.Add(tbarVal,0,WACV)
578                    valSizer.Add(wx.StaticText(DData,wx.ID_ANY,' cos(2ThM):'),0,WACV)
579                    cos2tm = G2G.ValidatedTxtCtrl(DData,UseList[G2frame.hist]['Extinction'][2],'Cos2TM',
580                        min=0.,max=1.,nDig=(10,3),typeHint=float)
581                    valSizer.Add(cos2tm,0,WACV)
582                    extSizer.Add(valSizer,0,WACV)
583                val2Sizer =wx.BoxSizer(wx.HORIZONTAL)
584                if 'Primary' in UseList[G2frame.hist]['Extinction'][1]:
585                    Ekey = ['Ep',]
586                elif 'Secondary Type II' == UseList[G2frame.hist]['Extinction'][1]:
587                    Ekey = ['Es',]
588                elif 'Secondary Type I' == UseList[G2frame.hist]['Extinction'][1]:
589                    Ekey = ['Eg',]
590                else:
591                    Ekey = ['Eg','Es']
592                for ekey in Ekey:
593                    Eref = wx.CheckBox(DData,wx.ID_ANY,label=ekey+' : ')
594                    Eref.SetValue(UseList[G2frame.hist]['Extinction'][2][ekey][1])
595                    Indx[Eref.GetId()] = [G2frame.hist,ekey]
596                    Eref.Bind(wx.EVT_CHECKBOX, OnEref)
597                    val2Sizer.Add(Eref,0,WACV|wx.LEFT,5)
598                    Eval = G2G.ValidatedTxtCtrl(DData,UseList[G2frame.hist]['Extinction'][2][ekey],0,
599                        min=0.,nDig=(10,3,'g'),typeHint=float)
600                    val2Sizer.Add(Eval,0,WACV)
601                extSizer.Add(val2Sizer,0,WACV)
602        else:   #PWDR
603            extSizer = wx.BoxSizer(wx.HORIZONTAL)
604            extRef = wx.CheckBox(DData,wx.ID_ANY,label=' Extinction: ')
605            extRef.SetValue(UseList[G2frame.hist]['Extinction'][1])
606            extRef.Bind(wx.EVT_CHECKBOX, OnExtRef)
607            extSizer.Add(extRef,0,WACV|wx.LEFT,5)
608            extVal = G2G.ValidatedTxtCtrl(DData,UseList[G2frame.hist]['Extinction'],0,
609                min=0.,nDig=(10,2),typeHint=float)
610            extSizer.Add(extVal,0,WACV)
611
612        return extSizer
613       
614    def BabSizer():
615       
616        def OnBabRef(event):
617            Obj = event.GetEventObject()
618            item,bab = Indx[Obj.GetId()]
619            UseList[item]['Babinet']['Bab'+bab][1] = Obj.GetValue()
620       
621        babSizer = wx.BoxSizer(wx.HORIZONTAL)
622        for bab in ['A','U']:
623            babRef = wx.CheckBox(DData,wx.ID_ANY,label=' Babinet '+bab+': ')
624            babRef.SetValue(UseList[G2frame.hist]['Babinet']['Bab'+bab][1])
625            Indx[babRef.GetId()] = [G2frame.hist,bab]
626            babRef.Bind(wx.EVT_CHECKBOX, OnBabRef)
627            babSizer.Add(babRef,0,WACV|wx.LEFT,5)
628            babVal = G2G.ValidatedTxtCtrl(DData,UseList[G2frame.hist]['Babinet']['Bab'+bab],0,
629                nDig=(10,3),min=0.,typeHint=float)
630            babSizer.Add(babVal,0,WACV)
631        return babSizer
632       
633    def FlackSizer():
634       
635        def OnFlackRef(event):
636            Obj = event.GetEventObject()
637            UseList[G2frame.hist]['Flack'][1] = Obj.GetValue()
638               
639        flackSizer = wx.BoxSizer(wx.HORIZONTAL)
640        flackRef = wx.CheckBox(DData,wx.ID_ANY,label=' Flack parameter: ')
641        flackRef.SetValue(UseList[G2frame.hist]['Flack'][1])
642        flackRef.Bind(wx.EVT_CHECKBOX, OnFlackRef)
643        flackSizer.Add(flackRef,0,WACV|wx.LEFT,5)
644        flackVal = G2G.ValidatedTxtCtrl(DData,UseList[G2frame.hist]['Flack'],0,nDig=(10,3),typeHint=float)
645        flackSizer.Add(flackVal,0,WACV)
646        return flackSizer
647       
648    def twinSizer():
649       
650        def OnAddTwin(event):
651            twinMat = np.array([[-1,0,0],[0,-1,0],[0,0,-1]])    #inversion by default
652            twinVal = 0.0
653            UseList[G2frame.hist]['Twins'].append([twinMat,twinVal])
654            nNonM = UseList[G2frame.hist]['Twins'][0][1][2]
655            for i in range(nNonM):
656                UseList[G2frame.hist]['Twins'].append([False,0.0])
657            addtwin.SetValue(False)
658            wx.CallLater(100,RepaintHistogramInfo,DData.GetScrollPos(wx.VERTICAL))
659           
660        def OnMat(event):
661            event.Skip()
662            Obj = event.GetEventObject()
663            it,im = Indx[Obj.GetId()]
664            newMat = Obj.GetValue().split()
665            try:
666                uvw = [int(newMat[i]) for i in range(3)]
667            except ValueError:
668                uvw = UseList[G2frame.hist]['Twins'][it][0][im]
669            UseList[G2frame.hist]['Twins'][it][0][im] = uvw
670            Obj.SetValue('%3d %3d %3d'%(uvw[0],uvw[1],uvw[2]))
671           
672        def OnTwinVal(invalid,value,tc):
673            it = Indx[tc.GetId()]
674            sumTw = 0.
675            for it,twin in enumerate(UseList[G2frame.hist]['Twins']):
676                if it:
677                    sumTw += twin[1]
678            UseList[G2frame.hist]['Twins'][0][1][0] = 1.-sumTw
679            wx.CallLater(100,RepaintHistogramInfo,DData.GetScrollPos(wx.VERTICAL))
680           
681        def OnTwinRef(event):
682            Obj = event.GetEventObject()
683            UseList[G2frame.hist]['Twins'][0][1][1] = Obj.GetValue()
684           
685        def OnTwinInv(event):
686            Obj = event.GetEventObject()
687            it = Indx[Obj.GetId()]
688            UseList[G2frame.hist]['Twins'][it][0] = Obj.GetValue()
689                       
690        def OnTwinDel(event):
691            Obj = event.GetEventObject()
692            it = Indx[Obj.GetId()]
693            nNonM = UseList[G2frame.hist]['Twins'][0][1][2]
694            for i in range(nNonM):
695                del UseList[G2frame.hist]['Twins'][1+i+it]
696            del UseList[G2frame.hist]['Twins'][it]
697            sumTw = 0.
698            for it,twin in enumerate(UseList[G2frame.hist]['Twins']):
699                if it:
700                    sumTw += twin[1]
701            UseList[G2frame.hist]['Twins'][0][1][0] = 1.-sumTw
702            if len(UseList[G2frame.hist]['Twins']) == 1:
703                UseList[G2frame.hist]['Twins'][0][1][1] = False
704            wx.CallLater(100,RepaintHistogramInfo,DData.GetScrollPos(wx.VERTICAL))           
705           
706        nTwin = len(UseList[G2frame.hist]['Twins'])
707        twinsizer = wx.BoxSizer(wx.VERTICAL)
708        topsizer = wx.BoxSizer(wx.HORIZONTAL)         
709        topsizer.Add(wx.StaticText(DData,wx.ID_ANY,' Merohedral twins: '),0,WACV)
710        #temporary - add twin not allowed if nonmerohedral twins present
711#        if nTwin == 1 or 'bool' not in str(type(UseList[G2frame.hist]['Twins'][1][0])):
712        addtwin = wx.CheckBox(DData,wx.ID_ANY,label=' Add Twin Law')
713        addtwin.Bind(wx.EVT_CHECKBOX, OnAddTwin)
714        topsizer.Add(addtwin,0,WACV|wx.LEFT,5)
715        twinsizer.Add(topsizer)
716        Indx = {}
717        if nTwin > 1:
718            for it,Twin in enumerate(UseList[G2frame.hist]['Twins']):
719                twinMat,twinVal = Twin
720                matSizer = wx.BoxSizer(wx.HORIZONTAL)
721                if it:
722                    Style = wx.TE_PROCESS_ENTER
723                    TwVal = Twin[1]
724                else:
725                    Style = wx.TE_READONLY
726                    TwVal = Twin[1][0]
727                if 'bool' not in str(type(Twin[0])):
728                    matSizer.Add(wx.StaticText(DData,-1,' Twin Law: '),0,WACV|wx.LEFT,5)
729                    for im,Mat in enumerate(twinMat):
730                        mat = wx.TextCtrl(DData,wx.ID_ANY,'%3d %3d %3d'%(Mat[0],Mat[1],Mat[2]),
731                            style=Style)
732                        if it:
733                            Indx[mat.GetId()] = [it,im]
734                            mat.Bind(wx.EVT_TEXT_ENTER,OnMat)
735                            mat.Bind(wx.EVT_KILL_FOCUS,OnMat)
736                        else:
737                            mat.SetBackgroundColour(VERY_LIGHT_GREY)
738                        matSizer.Add(mat,0,WACV|wx.LEFT,5)
739                else:
740                    matSizer.Add(wx.StaticText(DData,-1,' Nonmerohedral twin component %d: '%(it)),0,WACV|wx.LEFT,5)
741                    if not SGData['SGInv']:
742                        twinv = wx.CheckBox(DData,wx.ID_ANY,label=' Use enantiomorph?')
743                        twinv.SetValue(Twin[0])
744                        Indx[twinv.GetId()] = it
745                        twinv.Bind(wx.EVT_CHECKBOX, OnTwinInv)
746                        matSizer.Add(twinv,0,WACV)
747                twinsizer.Add(matSizer,0,WACV|wx.LEFT,5)
748                valSizer = wx.BoxSizer(wx.HORIZONTAL)
749                valSizer.Add(wx.StaticText(DData,-1,label=' Twin element fraction:'),0,WACV)
750                if it:
751                    twinval = G2G.ValidatedTxtCtrl(DData,UseList[G2frame.hist]['Twins'][it],1,nDig=(10,3),
752                        min=0.,max=1.,typeHint=float,OnLeave=OnTwinVal)
753                    Indx[twinval.GetId()] = it
754                else:
755                    twinval = wx.TextCtrl(DData,-1,'%.3f'%(TwVal),style=Style)
756                    twinval.SetBackgroundColour(VERY_LIGHT_GREY)
757                valSizer.Add(twinval,0,WACV)
758                if it and 'bool' not in str(type(Twin[0])):
759                    twindel = wx.CheckBox(DData,wx.ID_ANY,label=' Delete?')
760                    Indx[twindel.GetId()] = it
761                    twindel.Bind(wx.EVT_CHECKBOX, OnTwinDel)
762                    valSizer.Add(twindel,0,WACV)
763                elif not it:
764                    twinref = wx.CheckBox(DData,wx.ID_ANY,label=' Refine?')
765                    twinref.SetValue(Twin[1][1])
766                    twinref.Bind(wx.EVT_CHECKBOX, OnTwinRef)
767                    valSizer.Add(twinref,0,WACV)
768                twinsizer.Add(valSizer,0,WACV|wx.LEFT,5)
769        return twinsizer
770       
771    def OnSelect(event):
772        G2frame.hist = G2frame.dataWindow.HistsInPhase[select.GetSelection()]
773        oldFocus = wx.Window.FindFocus()
774        G2plt.PlotSizeStrainPO(G2frame,data,G2frame.hist)
775        wx.CallLater(100,RepaintHistogramInfo)
776        wx.CallAfter(oldFocus.SetFocus)
777       
778    def RepaintHistogramInfo(Scroll=0):
779        G2frame.bottomSizer.DeleteWindows()
780        Indx.clear()
781        G2frame.bottomSizer = ShowHistogramInfo()
782        mainSizer.Add(G2frame.bottomSizer)
783        mainSizer.Layout()
784        G2frame.dataWindow.Refresh()
785        DData.SetVirtualSize(mainSizer.GetMinSize())
786        DData.Scroll(0,Scroll)
787        G2frame.dataWindow.SendSizeEvent()
788       
789    def ShowHistogramInfo():
790        '''This creates a sizer with all the information pulled out from the Phase/data dict
791        '''
792       
793        def OnUseData(event):
794            Obj = event.GetEventObject()
795            UseList[G2frame.hist]['Use'] = Obj.GetValue()
796
797        def OnLeBail(event):
798            Obj = event.GetEventObject()
799            if not UseList[G2frame.hist]['LeBail']:
800                UseList[G2frame.hist]['newLeBail'] = True
801            UseList[G2frame.hist]['LeBail'] = Obj.GetValue()
802
803        def OnResetSize(event):
804            Obj = event.GetEventObject()
805            Obj.SetValue(False)
806            item,name = Indx[Obj.GetId()]
807            if name == 'isotropic':
808                UseList[item]['Size'][1][0] = 1.0
809            elif name == 'uniaxial':
810                UseList[item]['Size'][1][0] = 1.0
811                UseList[item]['Size'][1][1] = 1.0
812            elif name == 'ellipsoidal':
813                for i in range(3):
814                    UseList[item]['Size'][4][i] = 1.0
815                    UseList[item]['Size'][4][i+3] = 0.0
816            G2plt.PlotSizeStrainPO(G2frame,data,item)
817            wx.CallLater(100,RepaintHistogramInfo,DData.GetScrollPos(wx.VERTICAL))
818           
819        def OnSizeAxis(event):           
820            event.Skip()
821            Obj = event.GetEventObject()
822            Saxis = Obj.GetValue().split()
823            try:
824                hkl = [int(Saxis[i]) for i in range(3)]
825            except (ValueError,IndexError):
826                hkl = UseList[G2frame.hist]['Size'][3]
827            if not np.any(np.array(hkl)):
828                hkl = UseList[G2frame.hist]['Size'][3]
829            UseList[G2frame.hist]['Size'][3] = hkl
830            h,k,l = hkl
831            Obj.SetValue('%3d %3d %3d'%(h,k,l)) 
832
833        if G2frame.hist not in UseList:               
834            G2frame.ErrorDialog('Missing data error',
835                    G2frame.hist+' not in GSAS-II data tree')
836            return
837        if 'Use' not in UseList[G2frame.hist]:      #patch
838            UseList[G2frame.hist]['Use'] = True
839        if 'LeBail' not in UseList[G2frame.hist]:
840            UseList[G2frame.hist]['LeBail'] = False
841        if 'newLeBail' not in UseList[G2frame.hist]:
842            UseList[G2frame.hist]['newLeBail'] = True
843        if 'Babinet' not in UseList[G2frame.hist]:
844            UseList[G2frame.hist]['Babinet'] = {'BabA':[0.0,False],'BabU':[0.0,False]}
845        bottomSizer = wx.BoxSizer(wx.VERTICAL)
846        useBox = wx.BoxSizer(wx.HORIZONTAL)
847        useData = wx.CheckBox(DData,wx.ID_ANY,label='Use Histogram: '+G2frame.hist+' ?')
848        useData.Bind(wx.EVT_CHECKBOX, OnUseData)
849        useData.SetValue(UseList[G2frame.hist]['Use'])
850        useBox.Add(useData,0,WACV)
851        if not generalData['doPawley'] and 'PWDR' in G2frame.hist[:4]:
852            lebail = wx.CheckBox(DData,wx.ID_ANY,label='Do LeBail extraction?')
853            lebail.Bind(wx.EVT_CHECKBOX, OnLeBail)
854            lebail.SetValue(UseList[G2frame.hist]['LeBail'])
855            useBox.Add(lebail,0,WACV)
856            if UseList[G2frame.hist]['LeBail']:
857                G2frame.SetStatusText('To reset LeBail, cycle LeBail check box.',1)
858        bottomSizer.Add(useBox,0,WACV|wx.TOP|wx.BOTTOM|wx.LEFT,5)
859       
860        bottomSizer.Add(ScaleSizer(),0,WACV|wx.BOTTOM,5)
861           
862        if G2frame.hist[:4] == 'PWDR':
863            if UseList[G2frame.hist]['Size'][0] == 'isotropic':
864                isoSizer = wx.BoxSizer(wx.HORIZONTAL)
865                isoSizer.Add(TopSizer(' Domain size model: ',['isotropic','uniaxial','ellipsoidal'],
866                    'Size',OnSizeType),0,WACV)
867                isoSizer.Add(LGmixSizer('Size',OnLGmixVal,OnLGmixRef))
868                isoSizer.Add(ResetSizer('isotropic',OnResetSize),0,WACV)
869                bottomSizer.Add(isoSizer)
870                bottomSizer.Add(IsoSizer(u'size(\xb5m): ','Size','%.3f',
871                    OnSizeVal,OnSizeRef),0,WACV|wx.BOTTOM,5)
872            elif UseList[G2frame.hist]['Size'][0] == 'uniaxial':
873                uniSizer = wx.BoxSizer(wx.HORIZONTAL)
874                uniSizer.Add(TopSizer(' Domain size model: ',['isotropic','uniaxial','ellipsoidal'],
875                    'Size',OnSizeType),0,WACV)
876                uniSizer.Add(LGmixSizer('Size',OnLGmixVal,OnLGmixRef))
877                uniSizer.Add(ResetSizer('uniaxial',OnResetSize),0,WACV)
878                bottomSizer.Add(UniSizer('Size',OnSizeAxis),0,WACV)
879                bottomSizer.Add(uniSizer)
880                bottomSizer.Add(UniDataSizer(u'size(\xb5m): ','Size','%.3f',OnSizeVal,OnSizeRef)
881                    ,0,WACV|wx.BOTTOM,5)
882            elif UseList[G2frame.hist]['Size'][0] == 'ellipsoidal':
883                ellSizer = wx.BoxSizer(wx.HORIZONTAL)
884                ellSizer.Add(TopSizer(' Domain size model: ',['isotropic','uniaxial','ellipsoidal'],
885                    'Size',OnSizeType),0,WACV)
886                ellSizer.Add(LGmixSizer('Size',OnLGmixVal,OnLGmixRef))
887                ellSizer.Add(ResetSizer('ellipsoidal',OnResetSize),0,WACV)
888                bottomSizer.Add(ellSizer)
889                bottomSizer.Add(EllSizeDataSizer(),0,WACV|wx.BOTTOM,5)
890           
891            if UseList[G2frame.hist]['Mustrain'][0] == 'isotropic':
892                isoSizer = wx.BoxSizer(wx.HORIZONTAL)
893                isoSizer.Add(TopSizer(' Mustrain model: ',['isotropic','uniaxial','generalized',],
894                    'Mustrain',OnStrainType),0,WACV)
895                isoSizer.Add(LGmixSizer('Mustrain',OnLGmixVal,OnLGmixRef))
896                isoSizer.Add(ResetSizer('isotropic',OnResetStrain),0,WACV)
897                bottomSizer.Add(isoSizer)
898                bottomSizer.Add(IsoSizer(' microstrain: ','Mustrain','%.1f',
899                    OnStrainVal,OnStrainRef),0,WACV|wx.BOTTOM,5)
900            elif UseList[G2frame.hist]['Mustrain'][0] == 'uniaxial':
901                uniSizer = wx.BoxSizer(wx.HORIZONTAL)
902                uniSizer.Add(TopSizer(' Mustrain model: ',['isotropic','uniaxial','generalized',],
903                    'Mustrain',OnStrainType),0,WACV)
904                uniSizer.Add(LGmixSizer('Mustrain',OnLGmixVal,OnLGmixRef))
905                uniSizer.Add(ResetSizer('uniaxial',OnResetStrain),0,WACV)
906                bottomSizer.Add(uniSizer)
907                bottomSizer.Add(UniSizer('Mustrain',OnStrainAxis),0,WACV)
908                bottomSizer.Add(UniDataSizer('mustrain: ','Mustrain','%.1f',OnStrainVal,OnStrainRef)
909                                ,0,WACV|wx.BOTTOM,5)
910            elif UseList[G2frame.hist]['Mustrain'][0] == 'generalized':
911                genSizer = wx.BoxSizer(wx.HORIZONTAL)
912                genSizer.Add(TopSizer(' Mustrain model: ',['isotropic','uniaxial','generalized',],
913                    'Mustrain',OnStrainType),0,WACV)
914                genSizer.Add(LGmixSizer('Mustrain',OnLGmixVal,OnLGmixRef))
915                genSizer.Add(ResetSizer('generalized',OnResetStrain),0,WACV)
916                bottomSizer.Add(genSizer)
917                bottomSizer.Add(GenStrainDataSizer(),0,WACV|wx.BOTTOM,5)
918           
919            bottomSizer.Add(wx.StaticText(DData,wx.ID_ANY,' Hydrostatic/elastic strain:'))
920            bottomSizer.Add(HstrainSizer())
921               
922            poSizer = wx.BoxSizer(wx.VERTICAL)
923            POData = UseList[G2frame.hist]['Pref.Ori.']
924# patch - add penalty items
925            if len(POData) < 7:
926                POData.append(['',])
927                POData.append(0.1)
928            if not POData[6]:
929                POData[6] = ['',]
930# end patch
931            poSizer.Add(PoTopSizer(POData))
932            if POData[0] == 'MD':
933                poSizer.Add(MDDataSizer(POData))
934            else:           #'SH'
935                if POData[4]:       #SH order > 0
936                    textJ = G2lat.textureIndex(POData[5])
937                    poSizer.Add(wx.StaticText(DData,wx.ID_ANY,' Spherical harmonic coefficients: '+'Texture index: %.3f'%(textJ))
938                        ,0,WACV|wx.TOP|wx.BOTTOM,5)
939                    poSizer.Add(SHDataSizer(POData),0,WACV|wx.TOP|wx.BOTTOM,5)
940                    poSizer.Add(SHPenalty(POData),0,WACV|wx.TOP|wx.BOTTOM,5)
941                   
942            bottomSizer.Add(poSizer,0,WACV|wx.TOP|wx.BOTTOM,5)
943            bottomSizer.Add(ExtSizer('PWDR'),0,WACV|wx.TOP|wx.BOTTOM,5)
944            if generalData['Type'] != 'magnetic': 
945                bottomSizer.Add(BabSizer(),0,WACV|wx.BOTTOM,5)
946        elif G2frame.hist[:4] == 'HKLF':
947#patch
948            if 'Flack' not in UseList[G2frame.hist]:
949                UseList[G2frame.hist]['Flack'] = [0.0,False]
950            if 'Twins' not in UseList[G2frame.hist]:
951                UseList[G2frame.hist]['Twins'] = [[np.array([[1,0,0],[0,1,0],[0,0,1]]),[1.0,False]],]
952#end patch
953            bottomSizer.Add(ExtSizer('HKLF'),0,WACV|wx.BOTTOM,5)
954            bottomSizer.Add(BabSizer(),0,WACV|wx.BOTTOM,5)
955            if not SGData['SGInv'] and len(UseList[G2frame.hist]['Twins']) < 2:
956                bottomSizer.Add(FlackSizer(),0,WACV|wx.BOTTOM,5)
957            bottomSizer.Add(twinSizer(),0,WACV|wx.BOTTOM,5)
958        return bottomSizer
959
960    ######################################################################
961    # Beginning of UpdateDData execution here
962    ######################################################################
963    G2frame.SetStatusText('',1)
964    keyList = G2frame.GetHistogramNames(['PWDR','HKLF'])
965    UseList = data['Histograms']
966    if UseList:
967        G2frame.dataWindow.DataMenu.Enable(G2G.wxID_DATADELETE,True)
968        for item in G2frame.Refine: item.Enable(True)
969    else:
970        G2frame.dataWindow.DataMenu.Enable(G2G.wxID_DATADELETE,False)
971        for item in G2frame.Refine: item.Enable(False)
972    # make a list of histograms (any type) used in this phase, ordered as in tree
973    G2frame.dataWindow.HistsInPhase = [name for name in keyList if name in UseList]
974    generalData = data['General']
975    PhaseName = generalData['Name']       
976    SGData = generalData['SGData']
977    if len(G2frame.dataWindow.HistsInPhase) == 0: # no associated histograms, nothing to display here
978        G2frame.hist = ''
979    elif hist and hist in G2frame.dataWindow.HistsInPhase: # something was input as a selection as an argument
980        G2frame.hist = hist
981    elif (not G2frame.hist) or (G2frame.hist not in G2frame.dataWindow.HistsInPhase): # no or bad selection but have data, take the first
982        G2frame.hist = G2frame.dataWindow.HistsInPhase[0]
983    Indx = {}
984   
985    if DData.GetSizer():
986        DData.GetSizer().Clear(True)
987    mainSizer = wx.BoxSizer(wx.VERTICAL)
988    mainSizer.Add(wx.StaticText(DData,wx.ID_ANY,' Histogram data for '+PhaseName+':'),0,WACV|wx.LEFT,5)
989    if G2frame.hist:
990        topSizer = wx.FlexGridSizer(1,2,5,5)
991        select = wx.ListBox(DData,choices=G2frame.dataWindow.HistsInPhase,
992                            style=wx.LB_SINGLE,size=(-1,120))
993        select.SetSelection(G2frame.dataWindow.HistsInPhase.index(G2frame.hist))
994        select.SetFirstItem(G2frame.dataWindow.HistsInPhase.index(G2frame.hist))
995        select.Bind(wx.EVT_LISTBOX,OnSelect)
996        topSizer.Add(select,0,WACV|wx.LEFT,5)
997        if any(['PWDR' in item for item in keyList]):
998            topSizer.Add(PlotSizer())
999        mainSizer.Add(topSizer)       
1000        G2frame.bottomSizer = ShowHistogramInfo()
1001        mainSizer.Add(G2frame.bottomSizer)
1002    elif not keyList:
1003        mainSizer.Add(wx.StaticText(DData,wx.ID_ANY,'  (This project has no data; use Import to read it)'),
1004                      0,WACV|wx.TOP,10)
1005    elif not UseList in G2frame.dataWindow.HistsInPhase:
1006        mainSizer.Add(wx.StaticText(DData,wx.ID_ANY,'  (This phase has no associated data; use appropriate Edit/Add... menu item)'),
1007                      0,WACV|wx.TOP,10)
1008    else:
1009        mainSizer.Add(wx.StaticText(DData,wx.ID_ANY,'  (Strange, how did we get here?)'),
1010                      0,WACV|wx.TOP,10)
1011       
1012    G2phsGUI.SetPhaseWindow(DData,mainSizer,Scroll=Scroll)
Note: See TracBrowser for help on using the repository browser.