source: trunk/GSASIIddataGUI.py @ 1878

Last change on this file since 1878 was 1878, checked in by vondreele, 7 years ago

refactor DDataGUI - mostly move event routines to be inside respective sizer routines
Enable Flack parameter - function OK; derivatives need work
Allow inversion of noncentrosymmetric structures in SymOpDialog? - to test enantiomers
some work to make pdf stuff neutron TOF friendly - not complete
fix Debye background function - now works; refactor result printing for it

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