source: trunk/GSASIIddataGUI.py @ 1875

Last change on this file since 1875 was 1875, checked in by vondreele, 8 years ago

add Flack parameter to GUI (commented out for now)

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