source: trunk/GSASIIddataGUI.py @ 1785

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

Add new routine to GSAS.py, StartProject?, called by both OpenFile? & the case with project file in arg list. An attempt at using shift/arrow to go to next/prev tree sub entry.
Fix a problem with new phases & sph harm preferred orientation.
Add HKLF rejection to derivative calc.

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