source: trunk/GSASIIimgGUI.py @ 1571

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

fix typos in small angle tutorials
add menu with copy & reset to instrument parameters for SASD data
copy masks now copies the lower threshold
work on indexing incommensurate powder patterns, plots

  • Property svn:eol-style set to native
  • Property svn:keywords set to Date Author Revision URL Id
File size: 85.1 KB
Line 
1# -*- coding: utf-8 -*-
2#GSASII - image data display routines
3########### SVN repository information ###################
4# $Date: 2014-11-15 18:01:30 +0000 (Sat, 15 Nov 2014) $
5# $Author: vondreele $
6# $Revision: 1571 $
7# $URL: trunk/GSASIIimgGUI.py $
8# $Id: GSASIIimgGUI.py 1571 2014-11-15 18:01:30Z vondreele $
9########### SVN repository information ###################
10'''
11*GSASIIimgGUI: Image GUI*
12-------------------------
13
14Control image display and processing
15
16'''
17import os.path
18import wx
19import wx.lib.scrolledpanel as wxscroll
20import matplotlib as mpl
21import math
22import time
23import copy
24import GSASIIpath
25GSASIIpath.SetVersionNumber("$Revision: 1571 $")
26import GSASIIimage as G2img
27import GSASIImath as G2mth
28import GSASIIplot as G2plt
29import GSASIIIO as G2IO
30import GSASIIgrid as G2gd
31import numpy as np
32
33VERY_LIGHT_GREY = wx.Colour(235,235,235)
34WACV = wx.ALIGN_CENTER_VERTICAL
35
36# trig functions in degrees
37sind = lambda x: math.sin(x*math.pi/180.)
38tand = lambda x: math.tan(x*math.pi/180.)
39cosd = lambda x: math.cos(x*math.pi/180.)
40asind = lambda x: 180.*math.asin(x)/math.pi
41   
42################################################################################
43##### Image Data
44################################################################################
45
46def UpdateImageData(G2frame,data):
47   
48    def OnPixVal(event):
49        Obj = event.GetEventObject()
50        id = Indx[Obj.GetId()]
51        try:
52            data['pixelSize'][id] = min(500,max(10,float(Obj.GetValue())))
53        except ValueError:
54            pass
55        Obj.SetValue('%.3f'%(data['pixelSize'][id]))
56        G2plt.PlotExposedImage(G2frame,newPlot=True,event=event)
57       
58       
59       
60    if G2frame.dataDisplay:
61        G2frame.dataDisplay.Destroy()
62    if not G2frame.dataFrame.GetStatusBar():
63        G2frame.dataFrame.CreateStatusBar()
64    G2frame.dataDisplay = wx.Panel(G2frame.dataFrame)
65    mainSizer = wx.BoxSizer(wx.VERTICAL)
66    mainSizer.Add(wx.StaticText(G2frame.dataDisplay,
67        label='Do not change anything here unless you are absolutely sure!'),0,WACV)
68    mainSizer.Add(wx.StaticText(G2frame.dataDisplay,label=' Image size: %d by %d'%(data['size'][0],data['size'][1])),0,WACV)
69    pixSize = wx.FlexGridSizer(0,4,5,5)
70    pixLabels = [u' Pixel X-dimension (\xb5m)',u' Pixel Y-dimension (\xb5m)']
71    Indx = {}
72    for i,[pixLabel,pix] in enumerate(zip(pixLabels,data['pixelSize'])):
73        pixSize.Add(wx.StaticText(G2frame.dataDisplay,label=pixLabel),0,WACV)
74        pixVal = wx.TextCtrl(G2frame.dataDisplay,value='%.3f'%(pix),style=wx.TE_PROCESS_ENTER)
75        Indx[pixVal.GetId()] = i
76        pixVal.Bind(wx.EVT_TEXT_ENTER,OnPixVal)
77        pixVal.Bind(wx.EVT_KILL_FOCUS,OnPixVal)
78        pixSize.Add(pixVal,0,WACV)
79    mainSizer.Add(pixSize,0)
80   
81    mainSizer.Layout()   
82    G2frame.dataDisplay.SetSizer(mainSizer)
83    fitSize = mainSizer.Fit(G2frame.dataFrame)
84    G2frame.dataFrame.setSizePosLeft(fitSize)
85    G2frame.dataDisplay.SetSize(fitSize)
86
87################################################################################
88##### Image Controls
89################################################################################                   
90def UpdateImageControls(G2frame,data,masks):
91    '''Shows and handles the controls on the "Image Controls"
92    data tree entry
93    '''
94    import ImageCalibrants as calFile
95#patch
96    if 'GonioAngles' not in data:
97        data['GonioAngles'] = [0.,0.,0.]
98    if 'DetDepth' not in data:
99        data['DetDepth'] = 0.
100        data['DetDepthRef'] = False
101    if 'SampleAbs' not in data:
102        data['SampleShape'] = 'Cylinder'
103        data['SampleAbs'] = [0.0,False]
104    if 'binType' not in data:
105        if 'PWDR' in data['type']:
106            data['binType'] = '2-theta'
107        elif 'SASD' in data['type']:
108            data['binType'] = 'log(q)'
109#end patch
110   
111# Menu items
112           
113    def OnCalibrate(event):       
114        G2frame.dataFrame.ImageEdit.Enable(id=G2gd.wxID_IMRECALIBRATE,enable=True)   
115        G2frame.dataFrame.GetStatusBar().SetStatusText('Select > 4 points on 1st used ring; LB to pick, RB on point to delete else RB to finish')
116        G2frame.ifGetRing = True
117       
118    def OnRecalibrate(event):
119        G2img.ImageRecalibrate(G2frame,data,masks)
120        UpdateImageControls(G2frame,data,masks)
121       
122    def OnClearCalib(event):
123        data['ring'] = []
124        data['rings'] = []
125        data['ellipses'] = []
126#        G2frame.dataFrame.ImageEdit.Enable(id=G2gd.wxID_IMRECALIBRATE,enable=False)   
127        G2plt.PlotExposedImage(G2frame,event=event)
128           
129    def OnIntegrate(event):
130        blkSize = 128   #this seems to be optimal; will break in polymask if >1024
131        Nx,Ny = data['size']
132        nXBlks = (Nx-1)/blkSize+1
133        nYBlks = (Ny-1)/blkSize+1
134        Nup = nXBlks*nYBlks*3+3
135        dlg = wx.ProgressDialog("Elapsed time","2D image integration",Nup,
136            style = wx.PD_ELAPSED_TIME|wx.PD_AUTO_HIDE)
137        try:
138            sumImg = G2frame.ImageZ
139            darkImg,darkScale = data['dark image']
140            if darkImg:
141                Did = G2gd.GetPatternTreeItemId(G2frame, G2frame.root, darkImg)
142                Npix,imagefile = G2frame.PatternTree.GetItemPyData(Did)
143                darkImage = G2IO.GetImageData(G2frame,imagefile,True)
144                sumImg += darkImage*darkScale
145            backImg,backScale = data['background image']           
146            if backImg:     #ignores any transmission effect in the background image
147                Bid = G2gd.GetPatternTreeItemId(G2frame, G2frame.root, backImg)
148                Npix,imagefile = G2frame.PatternTree.GetItemPyData(Bid)
149                backImage = G2IO.GetImageData(G2frame,imagefile,True)
150                Bdata = G2frame.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(G2frame,Bid,'Image Controls'))
151                BdarkImg,BdarkScale = Bdata['dark image']
152                if BdarkImg:
153                    BDid = G2gd.GetPatternTreeItemId(G2frame, G2frame.root,BdarkImg)
154                    Npix,imagefile = G2frame.PatternTree.GetItemPyData(BDid)
155                    BdarkImage = G2IO.GetImageData(G2frame,imagefile,True)
156                    backImage += BdarkImage*BdarkScale               
157                sumImg += backImage*backScale
158            G2frame.Integrate = G2img.ImageIntegrate(sumImg,data,masks,blkSize,dlg)
159#            G2plt.PlotIntegration(G2frame,newPlot=True)
160            Id = G2IO.SaveIntegration(G2frame,G2frame.PickId,data)
161            G2frame.PatternId = Id
162            G2frame.PatternTree.SelectItem(Id)
163            G2frame.PatternTree.Expand(Id)
164        finally:
165            dlg.Destroy()
166        for item in G2frame.MakePDF: item.Enable(True)
167       
168    def OnIntegrateAll(event):
169        print 'integrate all'
170        TextList = [[False,'All IMG',0]]
171        Names = []
172        if G2frame.PatternTree.GetCount():
173            id, cookie = G2frame.PatternTree.GetFirstChild(G2frame.root)
174            while id:
175                name = G2frame.PatternTree.GetItemText(id)
176                Names.append(name)
177                if 'IMG' in name:
178                    TextList.append([False,name,id])
179                id, cookie = G2frame.PatternTree.GetNextChild(G2frame.root, cookie)
180            if len(TextList) == 1:
181                G2frame.ErrorDialog('Nothing to integrate','There must some "IMG" patterns')
182                return
183            dlg = G2frame.CopyDialog(G2frame,'Image integration controls','Select images to integrate:',TextList)
184            try:
185                if dlg.ShowModal() == wx.ID_OK:
186                    result = dlg.GetData()
187                    if result[0][0]:                    #the 'All IMG' is True
188                        result = TextList[1:]
189                        for item in result: item[0] = True
190                    G2frame.EnablePlot = False
191                    for item in result:
192                        ifintegrate,name,id = item
193                        if ifintegrate:
194                            Id = G2gd.GetPatternTreeItemId(G2frame,id, 'Image Controls')
195                            Data = G2frame.PatternTree.GetItemPyData(Id)
196                            blkSize = 128   #this seems to be optimal; will break in polymask if >1024
197                            Nx,Ny = Data['size']
198                            nXBlks = (Nx-1)/blkSize+1
199                            nYBlks = (Ny-1)/blkSize+1
200                            Nup = nXBlks*nYBlks*3+3
201                            dlgp = wx.ProgressDialog("Elapsed time","2D image integration",Nup,
202                                style = wx.PD_ELAPSED_TIME|wx.PD_AUTO_HIDE)
203                            try:
204                                id = G2gd.GetPatternTreeItemId(G2frame, G2frame.root, name)
205                                Npix,imagefile = G2frame.PatternTree.GetItemPyData(id)
206                                image = G2IO.GetImageData(G2frame,imagefile,True)
207                                backImage = []
208                                if Data['background image'][0]:
209                                    backImg = Data['background image'][0]
210                                    backScale = Data['background image'][1]
211                                    id = G2gd.GetPatternTreeItemId(G2frame, G2frame.root, backImg)
212                                    Npix,imagefile = G2frame.PatternTree.GetItemPyData(id)
213                                    backImage = G2IO.GetImageData(G2frame,imagefile,True)*backScale
214                                try:
215                                    Masks = G2frame.PatternTree.GetItemPyData(
216                                        G2gd.GetPatternTreeItemId(G2frame,G2frame.Image, 'Masks'))
217                                except TypeError:       #missing Masks
218                                    Imin,Imax = Data['Range']
219                                    Masks = {'Points':[],'Rings':[],'Arcs':[],'Polygons':[],'Frames':[],'Thresholds':[(Imin,Imax),[Imin,Imax]]}
220                                    G2frame.PatternTree.SetItemPyData(
221                                        G2gd.GetPatternTreeItemId(G2frame,G2frame.Image, 'Masks'),Masks)
222                                if len(backImage):                               
223                                    G2frame.Integrate = G2img.ImageIntegrate(image+backImage,Data,Masks,blkSize,dlgp)
224                                else:
225                                    G2frame.Integrate = G2img.ImageIntegrate(image,Data,Masks,blkSize,dlgp)
226                                pId = G2IO.SaveIntegration(G2frame,Id,Data)
227                            finally:
228                                dlgp.Destroy()
229                    else:
230                        G2frame.EnablePlot = True
231                        G2frame.PatternTree.SelectItem(pId)
232                        G2frame.PatternTree.Expand(pId)
233                        G2frame.PatternId = pId
234                       
235            finally:
236                dlg.Destroy()
237       
238    def OnCopyControls(event):
239        TextList = [[False,'All IMG',0]]
240        Names = []
241        if G2frame.PatternTree.GetCount():
242            id, cookie = G2frame.PatternTree.GetFirstChild(G2frame.root)
243            while id:
244                name = G2frame.PatternTree.GetItemText(id)
245                Names.append(name)
246                if 'IMG' in name:
247                    if id == G2frame.Image:
248                        Source = name
249                        Data = copy.deepcopy(data)
250#                        Data = copy.deepcopy(G2frame.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(G2frame,id, 'Image Controls')))
251                        Data['showLines'] = True
252                        Data['ring'] = []
253                        Data['rings'] = []
254                        Data['ellipses'] = []
255                        Data['setDefault'] = False
256                    else:
257                        TextList.append([False,name,id])
258                id, cookie = G2frame.PatternTree.GetNextChild(G2frame.root, cookie)
259            if len(TextList) == 1:
260                G2frame.ErrorDialog('Nothing to copy controls to','There must be more than one "IMG" pattern')
261                return
262            dlg = G2frame.CopyDialog(G2frame,'Copy image controls','Copy controls from '+Source+' to:',TextList)
263            try:
264                if dlg.ShowModal() == wx.ID_OK:
265                    result = dlg.GetData()
266                    if result[0][0]:
267                        result = TextList[1:]
268                        for item in result: item[0] = True
269                    for i,item in enumerate(result):
270                        ifcopy,name,id = item
271                        if ifcopy:
272                            oldData = copy.deepcopy(G2frame.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(G2frame,id, 'Image Controls')))
273                            Data['range'] = oldData['range']
274                            Data['size'] = oldData['size']
275                            Data['GonioAngles'] = oldData.get('GonioAngles', [0.,0.,0.])
276                            Data['ring'] = []
277                            Data['rings'] = []
278                            Data['ellipses'] = []
279                            G2frame.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(G2frame,id, 'Image Controls'),copy.deepcopy(Data))
280            finally:
281                dlg.Destroy()
282                G2frame.PatternTree.SelectItem(G2frame.PickId)
283               
284    def OnSaveControls(event):
285        dlg = wx.FileDialog(G2frame, 'Choose image controls file', '.', '', 
286            'image control files (*.imctrl)|*.imctrl',wx.FD_SAVE|wx.FD_OVERWRITE_PROMPT|wx.CHANGE_DIR)
287        try:
288            if dlg.ShowModal() == wx.ID_OK:
289                filename = dlg.GetPath()
290                # make sure extension is .imctrl
291                filename = os.path.splitext(filename)[0]+'.imctrl'
292                File = open(filename,'w')
293                save = {}
294                keys = ['type','wavelength','calibrant','distance','center',
295                    'tilt','rotation','azmthOff','fullIntegrate','LRazimuth',
296                    'IOtth','outChannels','outAzimuths','invert_x','invert_y','DetDepth',
297                    'calibskip','pixLimit','cutoff','calibdmin','chisq',
298                    'binType','SampleShape','PolaVal','SampleAbs','dark image','background image']
299                for key in keys:
300                    if key not in data:     #uncalibrated!
301                        continue
302                    File.write(key+':'+str(data[key])+'\n')
303                File.close()
304        finally:
305            dlg.Destroy()
306       
307    def OnLoadControls(event):
308        cntlList = ['wavelength','distance','tilt','invert_x','invert_y','type',
309            'fullIntegrate','outChannels','outAzimuths','LRazimuth','IOtth','azmthOff','DetDepth',
310            'calibskip','pixLimit','cutoff','calibdmin','chisq',
311            'PolaVal','SampleAbs','dark image','background image']
312        dlg = wx.FileDialog(G2frame, 'Choose image controls file', '.', '', 
313            'image control files (*.imctrl)|*.imctrl',wx.OPEN|wx.CHANGE_DIR)
314        try:
315            if dlg.ShowModal() == wx.ID_OK:
316                filename = dlg.GetPath()
317                File = open(filename,'r')
318                save = {}
319                S = File.readline()
320                while S:
321                    if S[0] == '#':
322                        S = File.readline()
323                        continue
324                    [key,val] = S[:-1].split(':')
325                    if key in ['type','calibrant','binType','SampleShape',]:    #strings
326                        save[key] = val
327                    elif key in ['rotation']:
328                        save[key] = float(val)
329                    elif key in ['center',]:
330                        if ',' in val:
331                            save[key] = eval(val)
332                        else:
333                            vals = val.strip('[] ').split()
334                            save[key] = [float(vals[0]),float(vals[1])] 
335                    elif key in cntlList:
336                        save[key] = eval(val)
337                    S = File.readline()
338                data.update(save)
339                G2frame.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(G2frame,G2frame.Image, 'Image Controls'),copy.deepcopy(data))
340                UpdateImageControls(G2frame,data,masks)
341                G2plt.PlotExposedImage(G2frame,event=event)
342               
343                File.close()
344        finally:
345            dlg.Destroy()
346           
347# Sizers
348                                       
349    def ComboSizer():
350
351        def OnDataType(event):
352            data['type'] = typeSel.GetValue()[:4]
353            if 'SASD' in data['type']:
354                data['SampleAbs'][0] = np.exp(-data['SampleAbs'][0]) #switch from muT to trans!
355                if data['binType'] == '2-theta': data['binType'] = 'log(q)'  #switch default bin type
356            elif 'PWDR' in data['type']:
357                data['SampleAbs'][0] = -np.log(data['SampleAbs'][0])  #switch from trans to muT!
358                if data['binType'] == 'log(q)': data['binType'] = '2-theta'  #switch default bin type                 
359            wx.CallAfter(UpdateImageControls,G2frame,data,masks)
360   
361        def OnNewColorBar(event):
362            data['color'] = colSel.GetValue()
363            G2plt.PlotExposedImage(G2frame,event=event)
364       
365        def OnAzmthOff(event):
366            try:
367                azmthoff = float(azmthOff.GetValue())
368                data['azmthOff'] = azmthoff
369            except ValueError:
370                pass
371            azmthOff.SetValue("%.2f"%(data['azmthOff']))          #reset in case of error 
372            G2plt.PlotExposedImage(G2frame,event=event)
373       
374        comboSizer = wx.BoxSizer(wx.HORIZONTAL)
375        comboSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Type of image data: '),0,WACV)
376        typeSel = wx.ComboBox(parent=G2frame.dataDisplay,value=typeDict[data['type']],choices=typeList,
377            style=wx.CB_READONLY|wx.CB_DROPDOWN)
378        typeSel.SetValue(data['type'])
379        typeSel.Bind(wx.EVT_COMBOBOX, OnDataType)
380        comboSizer.Add(typeSel,0,WACV)
381        comboSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Color bar '),0,WACV)
382        colSel = wx.ComboBox(parent=G2frame.dataDisplay,value=data['color'],choices=colorList,
383            style=wx.CB_READONLY|wx.CB_DROPDOWN)
384        colSel.Bind(wx.EVT_COMBOBOX, OnNewColorBar)
385        comboSizer.Add(colSel,0,WACV)
386        comboSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Azimuth offset '),0,WACV)
387        azmthOff = wx.TextCtrl(parent=G2frame.dataDisplay,value=("%.2f" % (data['azmthOff'])),
388            style=wx.TE_PROCESS_ENTER)
389        azmthOff.Bind(wx.EVT_TEXT_ENTER,OnAzmthOff)
390        azmthOff.Bind(wx.EVT_KILL_FOCUS,OnAzmthOff)
391        comboSizer.Add(azmthOff,0,WACV)
392        return comboSizer
393       
394    def MaxSizer():
395               
396        def OnMaxVal(event):
397            try:
398                value = min(data['range'][0][1],int(maxVal.GetValue()))
399                if value < data['range'][1][0]+1:
400                    raise ValueError
401                data['range'][1][1] = value
402            except ValueError:
403                pass
404            maxVal.SetValue('%.0f'%(data['range'][1][1]))
405            DeltOne = data['range'][1][1]-max(0.0,data['range'][0][0])
406            sqrtDeltOne = math.sqrt(DeltOne)
407            maxSel.SetValue(int(100*sqrtDeltOne/sqrtDeltZero))
408            minSel.SetValue(int(100*(data['range'][1][0]/DeltOne)))
409            G2plt.PlotExposedImage(G2frame,event=event)
410           
411        def OnMinVal(event):
412            try:
413                value = int(minVal.GetValue())
414                if value > data['range'][1][1]-1:
415                    raise ValueError
416                data['range'][1][0] = value
417            except ValueError:
418                pass
419            minVal.SetValue('%.0f'%(data['range'][1][0]))
420            minSel.SetValue(int(100*(data['range'][1][0]-max(0.0,data['range'][0][0]))/DeltOne))
421            G2plt.PlotExposedImage(G2frame,event=event)
422           
423        def OnMaxSlider(event):
424            sqrtDeltZero = math.sqrt(data['range'][0][1])
425            imax = int(maxSel.GetValue())*sqrtDeltZero/100.
426            data['range'][1][1] = imax**2
427            data['range'][1][0] = max(0.0,min(data['range'][1][1]-1,data['range'][1][0]))
428            DeltOne = max(1.0,data['range'][1][1]-data['range'][1][0])
429            minSel.SetValue(int(100*(data['range'][1][0]/DeltOne)))
430            maxVal.SetValue('%.0f'%(data['range'][1][1]))
431            G2plt.PlotExposedImage(G2frame,event=event)
432           
433        def OnMinSlider(event):
434            DeltOne = data['range'][1][1]-data['range'][1][0]
435            imin = int(minSel.GetValue())*DeltOne/100.
436            data['range'][1][0] = max(0.0,min(data['range'][1][1]-1,imin))
437            minVal.SetValue('%.0f'%(data['range'][1][0]))
438            G2plt.PlotExposedImage(G2frame,event=event)
439           
440        maxSizer = wx.FlexGridSizer(0,3,0,5)
441        maxSizer.AddGrowableCol(1,1)
442        maxSizer.SetFlexibleDirection(wx.HORIZONTAL)
443        sqrtDeltZero = math.sqrt(data['range'][0][1]-max(0.0,data['range'][0][0]))
444        DeltOne = data['range'][1][1]-max(0.0,data['range'][0][0])
445        sqrtDeltOne = math.sqrt(DeltOne)
446        maxSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Max intensity'),0,WACV)
447        maxSel = wx.Slider(parent=G2frame.dataDisplay,style=wx.SL_HORIZONTAL,
448            value=int(100*sqrtDeltOne/sqrtDeltZero))
449        maxSizer.Add(maxSel,1,wx.EXPAND)
450        maxSel.Bind(wx.EVT_SLIDER, OnMaxSlider)
451        maxVal = wx.TextCtrl(parent=G2frame.dataDisplay,value='%.0f'%(data['range'][1][1]))
452        maxVal.Bind(wx.EVT_TEXT_ENTER,OnMaxVal)   
453        maxVal.Bind(wx.EVT_KILL_FOCUS,OnMaxVal)
454        maxSizer.Add(maxVal,0,WACV)   
455        maxSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Min intensity'),0,WACV)
456        minSel = wx.Slider(parent=G2frame.dataDisplay,style=wx.SL_HORIZONTAL,
457            value=int(100*(data['range'][1][0]-max(0.0,data['range'][0][0]))/DeltOne))
458        maxSizer.Add(minSel,1,wx.EXPAND)
459        minSel.Bind(wx.EVT_SLIDER, OnMinSlider)
460        minVal = wx.TextCtrl(parent=G2frame.dataDisplay,value='%.0f'%(data['range'][1][0]))
461        minVal.Bind(wx.EVT_TEXT_ENTER,OnMinVal)   
462        minVal.Bind(wx.EVT_KILL_FOCUS,OnMinVal)
463        maxSizer.Add(minVal,0,WACV)
464        return maxSizer
465       
466    def CalibCoeffSizer():
467       
468        def OnWavelength(event):
469            try:
470                wave = float(waveSel.GetValue())
471                if wave < .01:
472                    raise ValueError
473                data['wavelength'] = wave
474            except ValueError:
475                pass
476            waveSel.SetValue("%7.5f" % (data['wavelength']))          #reset in case of error
477           
478        def OnDetDepthRef(event):
479            data['DetDepthRef'] = penSel.GetValue()
480           
481        def OnDetDepth(event):
482            try:
483                data['DetDepth'] = float(penVal.GetValue())
484            except ValueError:
485                pass
486            penVal.SetValue("%6.3f" % (data['DetDepth']))          #reset in case of error                     
487           
488        calibSizer = wx.FlexGridSizer(0,2,5,5)
489        calibSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Calibration coefficients'),0,WACV)   
490        calibSizer.Add((5,0),0)
491        cent = data['center']
492        for axis,cnt in zip(['X','Y'],cent):
493            calibSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Beam center '+axis),0,WACV)
494            centText = wx.TextCtrl(parent=G2frame.dataDisplay,value=("%7.2f" % (cnt)),style=wx.TE_READONLY)
495            centText.SetBackgroundColour(VERY_LIGHT_GREY)
496            calibSizer.Add(centText,0,WACV)       
497        calibSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Wavelength'),0,WACV)
498        waveSel = wx.TextCtrl(parent=G2frame.dataDisplay,value=("%7.5f" % (data['wavelength'])),
499            style=wx.TE_PROCESS_ENTER)
500        waveSel.Bind(wx.EVT_TEXT_ENTER,OnWavelength)
501        waveSel.Bind(wx.EVT_KILL_FOCUS,OnWavelength)
502        calibSizer.Add(waveSel,0,WACV)             
503        calibSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Distance'),0,WACV)
504#        dist = wx.CheckBox(G2frame.dataDisplay,label=' Distance')  #possible future mod. to allow fix of calib. parms.?
505        distSel = wx.TextCtrl(parent=G2frame.dataDisplay,value=("%8.2f"%(data['distance'])),style=wx.TE_READONLY)
506        distSel.SetBackgroundColour(VERY_LIGHT_GREY)
507        calibSizer.Add(distSel,0,WACV)
508        calibSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Tilt angle'),0,WACV)
509        tiltSel = wx.TextCtrl(parent=G2frame.dataDisplay,value=("%9.3f"%(data['tilt'])),style=wx.TE_READONLY)
510        tiltSel.SetBackgroundColour(VERY_LIGHT_GREY)
511        calibSizer.Add(tiltSel,0,WACV)
512        calibSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Tilt rotation'),0,WACV)
513        rotSel = wx.TextCtrl(parent=G2frame.dataDisplay,value=("%9.3f"%(data['rotation'])),style=wx.TE_READONLY)
514        rotSel.SetBackgroundColour(VERY_LIGHT_GREY)
515        calibSizer.Add(rotSel,0,WACV)
516        if 'PWDR' in data['type']:
517            penSel = wx.CheckBox(parent=G2frame.dataDisplay,label='Penetration?')
518            calibSizer.Add(penSel,0,WACV)
519            penSel.Bind(wx.EVT_CHECKBOX, OnDetDepthRef)
520            penSel.SetValue(data['DetDepthRef'])
521            penVal = wx.TextCtrl(parent=G2frame.dataDisplay,value=("%6.5f" % (data['DetDepth'])),
522                style=wx.TE_PROCESS_ENTER)
523            penVal.Bind(wx.EVT_TEXT_ENTER,OnDetDepth)
524            penVal.Bind(wx.EVT_KILL_FOCUS,OnDetDepth)
525            calibSizer.Add(penVal,0,WACV)             
526       
527        return calibSizer
528   
529    def IntegrateSizer():
530       
531        def OnNewBinType(event):
532            data['binType'] = binSel.GetValue()
533       
534        def OnIOtth(event):
535            Ltth = max(float(G2frame.InnerTth.GetValue()),0.001)
536            Utth = float(G2frame.OuterTth.GetValue())
537            if Ltth > Utth:
538                Ltth,Utth = Utth,Ltth
539            data['IOtth'] = [Ltth,Utth]
540            G2frame.InnerTth.SetValue("%8.3f" % (Ltth))
541            G2frame.OuterTth.SetValue("%8.2f" % (Utth))
542            G2plt.PlotExposedImage(G2frame,event=event)
543       
544        def OnLRazim(event):
545            Lazm = int(G2frame.Lazim.GetValue())%360
546            Razm = int(G2frame.Razim.GetValue())%360
547            if Lazm > Razm:
548                Razm += 360
549            if data['fullIntegrate']:
550                Razm = Lazm+360
551            G2frame.Lazim.SetValue("%6d" % (Lazm))
552            G2frame.Razim.SetValue("%6d" % (Razm))
553            data['LRazimuth'] = [Lazm,Razm]
554            G2plt.PlotExposedImage(G2frame,event=event)
555       
556        def OnNumOutChans(event):
557            try:
558                numChans = int(outChan.GetValue())
559                if numChans < 10:
560                    raise ValueError
561                data['outChannels'] = numChans
562            except ValueError:
563                pass
564            outChan.SetValue(str(data['outChannels']))          #reset in case of error       
565       
566        def OnNumOutAzms(event):
567            try:
568                numAzms = int(outAzim.GetValue())
569                if numAzms < 1:
570                    raise ValueError
571                data['outAzimuths'] = numAzms           
572            except ValueError:
573                pass
574            outAzim.SetValue(str(data['outAzimuths']))          #reset in case of error       
575            G2plt.PlotExposedImage(G2frame,event=event)
576       
577        def OnOblique(event):
578            if data['Oblique'][1]:
579                data['Oblique'][1] = False
580            else:
581                data['Oblique'][1] = True
582               
583        def OnObliqVal(event):
584            try:
585                value = float(obliqVal.GetValue())
586                if 0.01 <= value <= 0.99:
587                    data['Oblique'][0] = value
588                else:
589                    raise ValueError
590            except ValueError:
591                pass
592            obliqVal.SetValue('%.3f'%(data['Oblique'][0]))
593                           
594        def OnSamAbs(event):
595            if data['SampleAbs'][1]:
596                data['SampleAbs'][1] = False
597            else:
598                data['SampleAbs'][1] = True
599               
600        def OnSamAbsVal(event):
601            try:
602                value = float(samabsVal.GetValue())
603                minmax = [0.,2.]
604                if 'SASD' in data['type']:
605                    minmax = [.05,1.0]
606                if minmax[0] <= value <= minmax[1]:
607                    data['SampleAbs'][0] = value
608                else:
609                    raise ValueError
610            except ValueError:
611                pass
612            samabsVal.SetValue('%.3f'%(data['SampleAbs'][0]))
613                           
614        def OnShowLines(event):
615            if data['showLines']:
616                data['showLines'] = False
617            else:
618                data['showLines'] = True
619            G2plt.PlotExposedImage(G2frame,event=event)
620           
621        def OnFullIntegrate(event):
622            Lazm =int(G2frame.Lazim.GetValue())
623            if data['fullIntegrate']:
624                data['fullIntegrate'] = False
625                data['LRazimuth'] = [Lazm,Lazm+20]
626            else:
627                data['fullIntegrate'] = True
628                data['LRazimuth'] = [Lazm,Lazm+360]
629            UpdateImageControls(G2frame,data,masks)
630            G2plt.PlotExposedImage(G2frame,event=event)
631           
632        def OnSetDefault(event):
633            if data['setDefault']:
634                G2frame.imageDefault = {}
635                data['setDefault'] = False
636            else:
637                G2frame.imageDefault = copy.copy(data)
638                data['setDefault'] = True
639               
640        def OnCenterAzm(event):
641            if data['centerAzm']:
642                data['centerAzm'] = False
643            else:
644                data['centerAzm'] = True
645            G2plt.PlotExposedImage(G2frame,event=event)
646               
647        def OnApplyPola(event):
648            if data['PolaVal'][1]:
649                data['PolaVal'][1] = False
650            else:
651                data['PolaVal'][1] = True
652               
653        def OnPolaVal(event):
654            try:
655                value = float(polaVal.GetValue())
656                if 0.001 <= value <= 0.999:
657                    data['PolaVal'][0] = value
658                else:
659                    raise ValueError
660            except ValueError:
661                pass
662            polaVal.SetValue('%.3f'%(data['PolaVal'][0]))
663                           
664        dataSizer = wx.FlexGridSizer(0,2,5,3)
665        dataSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Integration coefficients'),0,WACV)   
666        dataSizer.Add((5,0),0)
667        if 'PWDR' in data['type']:
668            binChoice = ['2-theta','q']
669        elif 'SASD' in data['type']:
670            binChoice = ['q','log(q)']
671        dataSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Bin style: Constant step bins in'),0,WACV)           
672        binSel = wx.ComboBox(parent=G2frame.dataDisplay,value=data['binType'],choices=binChoice,
673            style=wx.CB_READONLY|wx.CB_DROPDOWN)
674        binSel.Bind(wx.EVT_COMBOBOX, OnNewBinType)
675        dataSizer.Add(binSel,0,WACV)
676        dataSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Inner/Outer 2-theta'),0,WACV)           
677        IOtth = data['IOtth']
678        littleSizer = wx.BoxSizer(wx.HORIZONTAL)
679        G2frame.InnerTth = wx.TextCtrl(parent=G2frame.dataDisplay,
680            value=("%8.3f" % (IOtth[0])),style=wx.TE_PROCESS_ENTER)
681        G2frame.InnerTth.Bind(wx.EVT_TEXT_ENTER,OnIOtth)
682        G2frame.InnerTth.Bind(wx.EVT_KILL_FOCUS,OnIOtth)
683        littleSizer.Add(G2frame.InnerTth,0,WACV)
684        G2frame.OuterTth = wx.TextCtrl(parent=G2frame.dataDisplay,
685            value=("%8.2f" % (IOtth[1])),style=wx.TE_PROCESS_ENTER)
686        G2frame.OuterTth.Bind(wx.EVT_TEXT_ENTER,OnIOtth)
687        G2frame.OuterTth.Bind(wx.EVT_KILL_FOCUS,OnIOtth)
688        littleSizer.Add(G2frame.OuterTth,0,WACV)
689        dataSizer.Add(littleSizer,0,)
690        dataSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Start/End azimuth'),0,WACV)
691        LRazim = data['LRazimuth']
692        littleSizer = wx.BoxSizer(wx.HORIZONTAL)
693        G2frame.Lazim = wx.TextCtrl(parent=G2frame.dataDisplay,
694            value=("%6d" % (LRazim[0])),style=wx.TE_PROCESS_ENTER)
695        G2frame.Lazim.Bind(wx.EVT_TEXT_ENTER,OnLRazim)
696        G2frame.Lazim.Bind(wx.EVT_KILL_FOCUS,OnLRazim)
697        littleSizer.Add(G2frame.Lazim,0,WACV)
698        G2frame.Razim = wx.TextCtrl(parent=G2frame.dataDisplay,
699            value=("%6d" % (LRazim[1])),style=wx.TE_PROCESS_ENTER)
700        G2frame.Razim.Bind(wx.EVT_TEXT_ENTER,OnLRazim)
701        G2frame.Razim.Bind(wx.EVT_KILL_FOCUS,OnLRazim)
702        if data['fullIntegrate']:
703            G2frame.Razim.Enable(False)
704            G2frame.Razim.SetBackgroundColour(VERY_LIGHT_GREY)
705            G2frame.Razim.SetValue("%6d" % (LRazim[0]+360))
706        littleSizer.Add(G2frame.Razim,0,WACV)
707        dataSizer.Add(littleSizer,0,)
708        dataSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' No. 2-theta/azimuth bins'),0,WACV)
709        littleSizer = wx.BoxSizer(wx.HORIZONTAL)
710        outChan = wx.TextCtrl(parent=G2frame.dataDisplay,value=str(data['outChannels']),style=wx.TE_PROCESS_ENTER)
711        outChan.Bind(wx.EVT_TEXT_ENTER,OnNumOutChans)
712        outChan.Bind(wx.EVT_KILL_FOCUS,OnNumOutChans)
713        littleSizer.Add(outChan,0,WACV)
714        outAzim = wx.TextCtrl(parent=G2frame.dataDisplay,value=str(data['outAzimuths']),style=wx.TE_PROCESS_ENTER)
715        outAzim.Bind(wx.EVT_TEXT_ENTER,OnNumOutAzms)
716        outAzim.Bind(wx.EVT_KILL_FOCUS,OnNumOutAzms)
717        littleSizer.Add(outAzim,0,WACV)
718        dataSizer.Add(littleSizer,0,)
719        littleSizer = wx.BoxSizer(wx.HORIZONTAL)
720        samabs = wx.CheckBox(parent=G2frame.dataDisplay,label='Apply sample absorption?')
721        dataSizer.Add(samabs,0,WACV)
722        samabs.Bind(wx.EVT_CHECKBOX, OnSamAbs)
723        samabs.SetValue(data['SampleAbs'][1])
724        if 'PWDR' in data['type']:
725            littleSizer.Add(wx.StaticText(G2frame.dataDisplay,label='mu/R (0.00-2.0) '),0,WACV)
726        elif 'SASD' in data['type']:
727            littleSizer.Add(wx.StaticText(G2frame.dataDisplay,label='transmission '),0,WACV)
728        samabsVal = wx.TextCtrl(parent=G2frame.dataDisplay,value='%.3f'%(data['SampleAbs'][0]),style=wx.TE_PROCESS_ENTER)           
729        samabsVal.Bind(wx.EVT_TEXT_ENTER,OnSamAbsVal)
730        samabsVal.Bind(wx.EVT_KILL_FOCUS,OnSamAbsVal)
731        littleSizer.Add(samabsVal,0,WACV)
732        dataSizer.Add(littleSizer,0,)
733        if 'PWDR' in data['type']:
734            littleSizer = wx.BoxSizer(wx.HORIZONTAL)
735            oblique = wx.CheckBox(parent=G2frame.dataDisplay,label='Apply detector absorption?')
736            dataSizer.Add(oblique,0,WACV)
737            oblique.Bind(wx.EVT_CHECKBOX, OnOblique)
738            oblique.SetValue(data['Oblique'][1])
739            littleSizer.Add(wx.StaticText(G2frame.dataDisplay,label='Value (0.01-0.99)  '),0,WACV)
740            obliqVal = wx.TextCtrl(parent=G2frame.dataDisplay,value='%.3f'%(data['Oblique'][0]),style=wx.TE_PROCESS_ENTER)
741            obliqVal.Bind(wx.EVT_TEXT_ENTER,OnObliqVal)
742            obliqVal.Bind(wx.EVT_KILL_FOCUS,OnObliqVal)
743            littleSizer.Add(obliqVal,0,WACV)
744            dataSizer.Add(littleSizer,0,)
745        if 'SASD' in data['type']:
746            littleSizer = wx.BoxSizer(wx.HORIZONTAL)
747            setPolariz = wx.CheckBox(parent=G2frame.dataDisplay,label='Apply polarization?')
748            dataSizer.Add(setPolariz,0,WACV)
749            setPolariz.Bind(wx.EVT_CHECKBOX, OnApplyPola)
750            setPolariz.SetValue(data['PolaVal'][1])
751            littleSizer.Add(wx.StaticText(G2frame.dataDisplay,label='Value (0.001-0.999)  '),0,WACV)
752            polaVal = wx.TextCtrl(parent=G2frame.dataDisplay,value='%.3f'%(data['PolaVal'][0]),
753                style=wx.TE_PROCESS_ENTER)
754            polaVal.Bind(wx.EVT_TEXT_ENTER,OnPolaVal)
755            polaVal.Bind(wx.EVT_KILL_FOCUS,OnPolaVal)
756            littleSizer.Add(polaVal,0,WACV)
757            dataSizer.Add(littleSizer,0,)
758       
759        showLines = wx.CheckBox(parent=G2frame.dataDisplay,label='Show integration limits?')
760        dataSizer.Add(showLines,0,WACV)
761        showLines.Bind(wx.EVT_CHECKBOX, OnShowLines)
762        showLines.SetValue(data['showLines'])
763        fullIntegrate = wx.CheckBox(parent=G2frame.dataDisplay,label='Do full integration?')
764        dataSizer.Add(fullIntegrate,0,WACV)
765        fullIntegrate.Bind(wx.EVT_CHECKBOX, OnFullIntegrate)
766        fullIntegrate.SetValue(data['fullIntegrate'])
767        setDefault = wx.CheckBox(parent=G2frame.dataDisplay,label='Use as default for all images?')
768        dataSizer.Add(setDefault,0,WACV)
769        setDefault.Bind(wx.EVT_CHECKBOX, OnSetDefault)
770        setDefault.SetValue(data['setDefault'])
771        centerAzm = wx.CheckBox(parent=G2frame.dataDisplay,label='Azimuth at bin center?')
772        dataSizer.Add(centerAzm,0,WACV)
773        centerAzm.Bind(wx.EVT_CHECKBOX, OnCenterAzm)
774        centerAzm.SetValue(data['centerAzm'])
775        return dataSizer
776       
777    def BackSizer():
778       
779        def OnBackImage(event):
780            data['background image'][0] = backImage.GetValue()
781           
782        def OnDarkImage(event):
783            data['dark image'][0] = darkImage.GetValue()
784            G2plt.PlotExposedImage(G2frame,event=event)
785
786        def OnBackMult(event):
787            try:
788                mult = float(backMult.GetValue())
789                data['background image'][1] = mult
790            except ValueError:
791                pass
792            backMult.SetValue("%.3f" % (data['background image'][1]))          #reset in case of error
793       
794        def OnDarkMult(event):
795            try:
796                mult = float(darkMult.GetValue())
797                data['dark image'][1] = mult
798            except ValueError:
799                pass
800            darkMult.SetValue("%.3f" % (data['dark image'][1]))          #reset in case of error
801            G2plt.PlotExposedImage(G2frame,event=event)
802       
803        backSizer = wx.FlexGridSizer(0,4,5,5)
804
805        backSizer.Add(wx.StaticText(G2frame.dataDisplay,-1,' Dark image'),0,WACV)
806        Choices = ['',]+G2gd.GetPatternTreeDataNames(G2frame,['IMG ',])
807        darkImage = wx.ComboBox(parent=G2frame.dataDisplay,value=data['dark image'][0],choices=Choices,
808            style=wx.CB_READONLY|wx.CB_DROPDOWN)
809        darkImage.Bind(wx.EVT_COMBOBOX,OnDarkImage)
810        backSizer.Add(darkImage)
811        backSizer.Add(wx.StaticText(G2frame.dataDisplay,-1,' multiplier'),0,WACV)
812        darkMult =  wx.TextCtrl(parent=G2frame.dataDisplay,value=("%.3f" % (data['dark image'][1])),
813            style=wx.TE_PROCESS_ENTER)
814        darkMult.Bind(wx.EVT_TEXT_ENTER,OnDarkMult)
815        darkMult.Bind(wx.EVT_KILL_FOCUS,OnDarkMult)
816        backSizer.Add(darkMult,0,WACV)
817
818        backSizer.Add(wx.StaticText(G2frame.dataDisplay,-1,' Background image'),0,WACV)
819        Choices = ['',]+G2gd.GetPatternTreeDataNames(G2frame,['IMG ',])
820        backImage = wx.ComboBox(parent=G2frame.dataDisplay,value=data['background image'][0],choices=Choices,
821            style=wx.CB_READONLY|wx.CB_DROPDOWN)
822        backImage.Bind(wx.EVT_COMBOBOX,OnBackImage)
823        backSizer.Add(backImage)
824        backSizer.Add(wx.StaticText(G2frame.dataDisplay,-1,' multiplier'),0,WACV)
825        backMult =  wx.TextCtrl(parent=G2frame.dataDisplay,value=("%.3f" % (data['background image'][1])),
826            style=wx.TE_PROCESS_ENTER)
827        backMult.Bind(wx.EVT_TEXT_ENTER,OnBackMult)
828        backMult.Bind(wx.EVT_KILL_FOCUS,OnBackMult)
829        backSizer.Add(backMult,0,WACV)
830        return backSizer
831                       
832    def CalibSizer():
833               
834        def OnNewCalibrant(event):
835            data['calibrant'] = calSel.GetValue()
836            data['calibskip'] = calFile.Calibrants[data['calibrant']][3]
837            limits = calFile.Calibrants[data['calibrant']][4]
838            data['calibdmin'],data['pixLimit'],data['cutoff'] = limits
839            pixLimit.SetValue(str(limits[1]))
840            cutOff.SetValue('%.1f'%(limits[2]))
841            calibSkip.SetValue(str(data['calibskip']))
842            calibDmin.SetValue('%.1f'%(limits[0]))
843           
844        def OnCalibSkip(event):
845            data['calibskip'] = int(calibSkip.GetValue())
846           
847        def OnCalibDmin(event):
848            try:
849                dmin = float(calibDmin.GetValue())
850                if dmin < 0.25:
851                    raise ValueError
852                data['calibdmin'] = dmin
853            except ValueError:
854                pass
855            calibDmin.SetValue("%.2f"%(data['calibdmin']))          #reset in case of error 
856                   
857        def OnCutOff(event):
858            try:
859                cutoff = float(cutOff.GetValue())
860                if cutoff < 0.1:
861                    raise ValueError
862                data['cutoff'] = cutoff
863            except ValueError:
864                pass
865            cutOff.SetValue("%.1f"%(data['cutoff']))          #reset in case of error 
866       
867        def OnPixLimit(event):
868            data['pixLimit'] = int(pixLimit.GetValue())
869           
870        def OnSetRings(event):
871            if data['setRings']:
872                data['setRings'] = False
873            else:
874                data['setRings'] = True
875            G2plt.PlotExposedImage(G2frame,event=event)
876   
877        calibSizer = wx.FlexGridSizer(0,3,5,5)
878        comboSizer = wx.BoxSizer(wx.HORIZONTAL)   
879        comboSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Calibrant '),0,WACV)
880        calSel = wx.ComboBox(parent=G2frame.dataDisplay,value=data['calibrant'],choices=calList,
881            style=wx.CB_READONLY|wx.CB_DROPDOWN)
882        calSel.Bind(wx.EVT_COMBOBOX, OnNewCalibrant)
883        comboSizer.Add(calSel,0,WACV)
884        calibSizer.Add(comboSizer,0)
885       
886        comboSizer = wx.BoxSizer(wx.HORIZONTAL)   
887        comboSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Calib lines to skip   '),0,WACV)
888        calibSkip  = wx.ComboBox(parent=G2frame.dataDisplay,value=str(data['calibskip']),choices=[str(i) for i in range(25)],
889            style=wx.CB_READONLY|wx.CB_DROPDOWN)
890        calibSkip.Bind(wx.EVT_COMBOBOX, OnCalibSkip)
891        comboSizer.Add(calibSkip,0,WACV)
892        calibSizer.Add(comboSizer,0)
893       
894        comboSizer = wx.BoxSizer(wx.HORIZONTAL)       
895        comboSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Min calib d-spacing '),0,WACV)
896        calibDmin = wx.TextCtrl(parent=G2frame.dataDisplay,value=("%.2f" % (data['calibdmin'])),
897            style=wx.TE_PROCESS_ENTER)
898        calibDmin.Bind(wx.EVT_TEXT_ENTER,OnCalibDmin)
899        calibDmin.Bind(wx.EVT_KILL_FOCUS,OnCalibDmin)
900        comboSizer.Add(calibDmin,0,WACV)
901        calibSizer.Add(comboSizer,0)
902       
903        comboSizer = wx.BoxSizer(wx.HORIZONTAL)
904        comboSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Min ring I/Ib '),0,WACV)
905        cutOff = wx.TextCtrl(parent=G2frame.dataDisplay,value=("%.1f" % (data['cutoff'])),
906            style=wx.TE_PROCESS_ENTER)
907        cutOff.Bind(wx.EVT_TEXT_ENTER,OnCutOff)
908        cutOff.Bind(wx.EVT_KILL_FOCUS,OnCutOff)
909        comboSizer.Add(cutOff,0,WACV)
910        calibSizer.Add(comboSizer,0)
911       
912        comboSizer = wx.BoxSizer(wx.HORIZONTAL)
913        comboSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Pixel search range '),0,WACV)
914        pixLimit = wx.ComboBox(parent=G2frame.dataDisplay,value=str(data['pixLimit']),choices=['1','2','5','10','15','20'],
915            style=wx.CB_READONLY|wx.CB_DROPDOWN)
916        pixLimit.Bind(wx.EVT_COMBOBOX, OnPixLimit)
917        comboSizer.Add(pixLimit,0,WACV)
918        calibSizer.Add(comboSizer,0)
919       
920        comboSizer = wx.BoxSizer(wx.HORIZONTAL)
921        setRings = wx.CheckBox(parent=G2frame.dataDisplay,label='Show ring picks?')
922        comboSizer.Add(setRings,0)
923        setRings.Bind(wx.EVT_CHECKBOX, OnSetRings)
924        setRings.SetValue(data['setRings'])
925        calibSizer.Add(comboSizer,0)
926        return calibSizer
927       
928    def GonioSizer():
929       
930        ValObj = {}
931       
932        def OnGonioAngle(event):
933            Obj = event.GetEventObject()
934            item = ValObj[Obj.GetId()]
935            try:
936                value = float(Obj.GetValue())
937            except ValueError:
938                value = data['GonioAngles'][item]
939            data['GonioAngles'][item] = value
940            Obj.SetValue('%8.2f'%(value))
941       
942        gonioSizer = wx.BoxSizer(wx.HORIZONTAL)
943        names = ['Omega','Chi','Phi']
944        gonioSizer.Add(wx.StaticText(G2frame.dataDisplay,-1,'Sample goniometer angles: '),0,WACV)
945        for i,name in enumerate(names):
946            gonioSizer.Add(wx.StaticText(G2frame.dataDisplay,-1,name),0,WACV)
947            angle = wx.TextCtrl(G2frame.dataDisplay,-1,value='%8.2f'%(data['GonioAngles'][i]),
948                style=wx.TE_PROCESS_ENTER)
949            angle.Bind(wx.EVT_TEXT_ENTER,OnGonioAngle)
950            angle.Bind(wx.EVT_KILL_FOCUS,OnGonioAngle)
951            ValObj[angle.GetId()] = i
952            gonioSizer.Add(angle,0,WACV)
953        return gonioSizer
954       
955# Image Controls main code             
956                           
957    #fix for old files:
958    if 'azmthOff' not in data:
959        data['azmthOff'] = 0.0
960    if 'background image' not in data:
961        data['background image'] = ['',-1.0]
962    if 'dark image' not in data:
963        data['dark image'] = ['',-1.0]
964    if 'centerAzm' not in data:
965        data['centerAzm'] = False
966    if 'Oblique' not in data:
967        data['Oblique'] = [0.5,False]
968    if 'PolaVal' not in data:
969        data['PolaVal'] = [0.99,False]
970    #end fix
971   
972    colorList = sorted([m for m in mpl.cm.datad.keys() if not m.endswith("_r")],key=lambda s: s.lower())
973    calList = sorted([m for m in calFile.Calibrants.keys()],key=lambda s: s.lower())
974    typeList = ['PWDR - powder diffraction data','SASD - small angle scattering data',
975        'REFL - reflectometry data']
976    if not data.get('type'):                        #patch for old project files
977        data['type'] = 'PWDR'
978    typeDict = {'PWDR':typeList[0],'SASD':typeList[1],'REFL':typeList[2]}
979    if G2frame.dataDisplay:
980        G2frame.dataDisplay.Destroy()
981    G2gd.SetDataMenuBar(G2frame,G2frame.dataFrame.ImageMenu)
982    if not G2frame.dataFrame.GetStatusBar():
983        G2frame.dataFrame.CreateStatusBar()
984    G2frame.dataFrame.Bind(wx.EVT_MENU, OnCalibrate, id=G2gd.wxID_IMCALIBRATE)
985    G2frame.dataFrame.Bind(wx.EVT_MENU, OnRecalibrate, id=G2gd.wxID_IMRECALIBRATE)
986    G2frame.dataFrame.Bind(wx.EVT_MENU, OnClearCalib, id=G2gd.wxID_IMCLEARCALIB)
987    if 'chisq' not in data:
988        G2frame.dataFrame.ImageEdit.Enable(id=G2gd.wxID_IMRECALIBRATE,enable=False)   
989    G2frame.dataFrame.Bind(wx.EVT_MENU, OnIntegrate, id=G2gd.wxID_IMINTEGRATE)
990    G2frame.dataFrame.Bind(wx.EVT_MENU, OnIntegrateAll, id=G2gd.wxID_INTEGRATEALL)
991    G2frame.dataFrame.Bind(wx.EVT_MENU, OnCopyControls, id=G2gd.wxID_IMCOPYCONTROLS)
992    G2frame.dataFrame.Bind(wx.EVT_MENU, OnSaveControls, id=G2gd.wxID_IMSAVECONTROLS)
993    G2frame.dataFrame.Bind(wx.EVT_MENU, OnLoadControls, id=G2gd.wxID_IMLOADCONTROLS)
994    G2frame.dataDisplay = wx.Panel(G2frame.dataFrame)
995
996    mainSizer = wx.BoxSizer(wx.VERTICAL)
997    mainSizer.Add((5,10),0)   
998    mainSizer.Add(ComboSizer(),0,wx.ALIGN_LEFT)
999    mainSizer.Add((5,5),0)           
1000    mainSizer.Add(MaxSizer(),0,wx.ALIGN_LEFT|wx.EXPAND)
1001   
1002    mainSizer.Add((5,5),0)
1003    DataSizer = wx.FlexGridSizer(0,2,5,5)
1004    DataSizer.Add(CalibCoeffSizer(),0)
1005    DataSizer.Add(IntegrateSizer(),0)       
1006    mainSizer.Add(DataSizer,0)
1007    mainSizer.Add((5,5),0)           
1008    mainSizer.Add(BackSizer(),0)
1009    mainSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Calibration controls:'),0,WACV)
1010    mainSizer.Add((5,5),0)
1011    mainSizer.Add(CalibSizer(),0,WACV)
1012    mainSizer.Add((5,5),0)
1013    mainSizer.Add(GonioSizer(),0,WACV)   
1014       
1015    mainSizer.Layout()   
1016    G2frame.dataDisplay.SetSizer(mainSizer)
1017    fitSize = mainSizer.Fit(G2frame.dataFrame)
1018    G2frame.dataFrame.setSizePosLeft(fitSize)
1019    G2frame.dataDisplay.SetSize(fitSize)
1020   
1021################################################################################
1022##### Masks
1023################################################################################
1024   
1025def UpdateMasks(G2frame,data):
1026    '''Shows and handles the controls on the "Masks"
1027    data tree entry
1028    '''
1029   
1030    def OnTextMsg(event):
1031        Obj = event.GetEventObject()
1032        Obj.SetToolTipString('Drag this mask on 2D Powder Image with mouse to change ')
1033       
1034    def OnThreshold(event):
1035        try:
1036            lower = max(int(lowerThreshold.GetValue()),thresh[0][0])
1037        except ValueError:
1038            lower = thresh[0][0]
1039        try:
1040            upper = min(int(upperThreshold.GetValue()),thresh[0][1])
1041        except ValueError:
1042            upper = thresh[0][1]
1043        data['Thresholds'][1] = [lower,upper]
1044        lowerThreshold.SetValue("%8d" % (lower))
1045        upperThreshold.SetValue("%8d" % (upper))
1046        G2plt.PlotExposedImage(G2frame,event=event)
1047       
1048    def OnSpotDiameter(event):
1049        Obj = event.GetEventObject()
1050        try:
1051            diameter = min(100.,max(0.1,float(Obj.GetValue())))
1052        except ValueError:
1053            diameter = 1.0
1054        Obj.SetValue("%.2f"%(diameter))
1055        data['Points'][spotIds.index(Obj.GetId())][2] = diameter
1056        G2plt.PlotExposedImage(G2frame,event=event)
1057       
1058    def OnDeleteSpot(event):
1059        Obj = event.GetEventObject()
1060        del(data['Points'][delSpotId.index(Obj)])
1061        UpdateMasks(G2frame,data)
1062        G2plt.PlotExposedImage(G2frame,event=event)
1063       
1064    def OnRingThickness(event):
1065        Obj = event.GetEventObject()
1066        try:
1067            thick = min(1.0,max(0.001,float(Obj.GetValue())))
1068        except ValueError:
1069            thick = 0.1
1070        Obj.SetValue("%.3f"%(thick))
1071        data['Rings'][ringIds.index(Obj.GetId())][1] = thick
1072        G2plt.PlotExposedImage(G2frame,event=event)
1073       
1074    def OnDeleteRing(event):
1075        Obj = event.GetEventObject()
1076        del(data['Rings'][delRingId.index(Obj)])
1077        UpdateMasks(G2frame,data)
1078        G2plt.PlotExposedImage(G2frame,event=event)
1079
1080    def OnArcThickness(event):
1081        Obj = event.GetEventObject()
1082        try:
1083            thick = min(20.0,max(0.001,float(Obj.GetValue())))
1084        except ValueError:
1085            thick = 0.1
1086        Obj.SetValue("%.3f"%(thick))
1087        data['Arcs'][arcIds.index(Obj.GetId())][2] = thick
1088        G2plt.PlotExposedImage(G2frame,event=event)
1089       
1090    def OnDeleteArc(event):
1091        Obj = event.GetEventObject()
1092        del(data['Arcs'][delArcId.index(Obj)])
1093        UpdateMasks(G2frame,data)
1094        G2plt.PlotExposedImage(G2frame,event=event)
1095
1096    def OnDeletePoly(event):
1097        Obj = event.GetEventObject()
1098        del(data['Polygons'][delPolyId.index(Obj)])
1099        UpdateMasks(G2frame,data)
1100        G2plt.PlotExposedImage(G2frame,event=event)
1101
1102    def OnDeleteFrame(event):
1103        data['Frames'] = []
1104        UpdateMasks(G2frame,data)
1105        G2plt.PlotExposedImage(G2frame,event=event)
1106
1107    def OnCopyMask(event):
1108        TextList = [[False,'All IMG',0]]
1109        Names = []
1110        if G2frame.PatternTree.GetCount():
1111            id, cookie = G2frame.PatternTree.GetFirstChild(G2frame.root)
1112            while id:
1113                name = G2frame.PatternTree.GetItemText(id)
1114                Names.append(name)
1115                if 'IMG' in name:
1116                    if id == G2frame.Image:
1117                        Source = name
1118                        Mask = copy.deepcopy(G2frame.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(G2frame,id, 'Masks')))
1119                        Thresh = Mask.pop('Thresholds')  #remove Thresholds from source mask & save it for later
1120                    else:
1121                        TextList.append([False,name,id])
1122                id, cookie = G2frame.PatternTree.GetNextChild(G2frame.root, cookie)
1123            if len(TextList) == 1:
1124                G2frame.ErrorDialog('Nothing to copy mask to','There must be more than one "IMG" pattern')
1125                return
1126            dlg = G2frame.CopyDialog(G2frame,'Copy mask information','Copy mask from '+Source+' to:',TextList)
1127            try:
1128                if dlg.ShowModal() == wx.ID_OK:
1129                    result = dlg.GetData()
1130                    if result[0][0]:
1131                        result = TextList[1:]
1132                        for item in result: item[0] = True
1133                    for i,item in enumerate(result):
1134                        ifcopy,name,id = item
1135                        if ifcopy:
1136                            mask = G2frame.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(G2frame,id, 'Masks'))
1137#                            Mask['Thresholds'][0] = mask['Thresholds'][0]
1138#                            Mask['Thresholds'][1][1] = min(mask['Thresholds'][1][1],Mask['Thresholds'][1][1])
1139                            mask.update(Mask)
1140                            mask['Thresholds'][1][0] = Thresh[1][0]  #copy only lower threshold                             
1141                            G2frame.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(G2frame,id, 'Masks'),copy.deepcopy(mask))
1142            finally:
1143                dlg.Destroy()
1144               
1145    def OnSaveMask(event):
1146        dlg = wx.FileDialog(G2frame, 'Choose image mask file', '.', '', 
1147            'image mask files (*.immask)|*.immask',wx.FD_SAVE|wx.FD_OVERWRITE_PROMPT|wx.CHANGE_DIR)
1148        try:
1149            if dlg.ShowModal() == wx.ID_OK:
1150                filename = dlg.GetPath()
1151                File = open(filename,'w')
1152                save = {}
1153                keys = ['Points','Rings','Arcs','Polygons','Frames','Thresholds']
1154                for key in keys:
1155                    File.write(key+':'+str(data[key])+'\n')
1156                File.close()
1157        finally:
1158            dlg.Destroy()
1159       
1160    def OnLoadMask(event):
1161        dlg = wx.FileDialog(G2frame, 'Choose image mask file', '.', '', 
1162            'image mask files (*.immask)|*.immask',wx.OPEN|wx.CHANGE_DIR)
1163        try:
1164            if dlg.ShowModal() == wx.ID_OK:
1165                filename = dlg.GetPath()
1166                File = open(filename,'r')
1167                save = {}
1168                oldThreshold = data['Thresholds'][0]
1169                S = File.readline()
1170                while S:
1171                    if S[0] == '#':
1172                        S = File.readline()
1173                        continue
1174                    [key,val] = S[:-1].split(':')
1175                    if key in ['Points','Rings','Arcs','Polygons','Frames','Thresholds']:
1176                        save[key] = eval(val)
1177                        if key == 'Thresholds':
1178                            save[key][0] = oldThreshold
1179                            save[key][1][1] = min(oldThreshold[1],save[key][1][1])
1180                    S = File.readline()
1181                data.update(save)
1182                UpdateMasks(G2frame,data)
1183                G2plt.PlotExposedImage(G2frame,event=event)               
1184                File.close()
1185        finally:
1186            dlg.Destroy()
1187           
1188    def OnNewSpotMask(event):
1189        'Start a new spot mask'
1190        G2frame.MaskKey = 's'
1191        G2plt.OnStartMask(G2frame)
1192       
1193    def OnNewArcMask(event):
1194        'Start a new arc mask'
1195        G2frame.MaskKey = 'a'
1196        G2plt.OnStartMask(G2frame)
1197       
1198    def OnNewRingMask(event):
1199        'Start a new ring mask'
1200        G2frame.MaskKey = 'r'
1201        G2plt.OnStartMask(G2frame)
1202       
1203    def OnNewPolyMask(event):
1204        'Start a new polygon mask'
1205        G2frame.MaskKey = 'p'
1206        G2plt.OnStartMask(G2frame)
1207       
1208    def OnNewFrameMask(event):
1209        'Start a new Frame mask'
1210        G2frame.MaskKey = 'f'
1211        G2plt.OnStartMask(G2frame)
1212               
1213    if G2frame.dataDisplay:
1214        G2frame.dataDisplay.Destroy()
1215    G2gd.SetDataMenuBar(G2frame,G2frame.dataFrame.MaskMenu)
1216    G2frame.dataFrame.Bind(wx.EVT_MENU, OnCopyMask, id=G2gd.wxID_MASKCOPY)
1217    G2frame.dataFrame.Bind(wx.EVT_MENU, OnLoadMask, id=G2gd.wxID_MASKLOAD)
1218    G2frame.dataFrame.Bind(wx.EVT_MENU, OnSaveMask, id=G2gd.wxID_MASKSAVE)
1219    G2frame.dataFrame.Bind(wx.EVT_MENU, OnNewSpotMask, id=G2gd.wxID_NEWMASKSPOT)
1220    G2frame.dataFrame.Bind(wx.EVT_MENU, OnNewArcMask, id=G2gd.wxID_NEWMASKARC)
1221    G2frame.dataFrame.Bind(wx.EVT_MENU, OnNewRingMask, id=G2gd.wxID_NEWMASKRING)
1222    G2frame.dataFrame.Bind(wx.EVT_MENU, OnNewPolyMask, id=G2gd.wxID_NEWMASKPOLY)
1223    G2frame.dataFrame.Bind(wx.EVT_MENU, OnNewFrameMask, id=G2gd.wxID_NEWMASKFRAME)
1224    if not G2frame.dataFrame.GetStatusBar():
1225        Status = G2frame.dataFrame.CreateStatusBar()
1226    if G2frame.MaskKey == 'f':
1227        G2frame.dataFrame.GetStatusBar().SetStatusText('Frame mask active - LB pick next point, RB close polygon')
1228    elif G2frame.MaskKey == 'p':
1229        G2frame.dataFrame.GetStatusBar().SetStatusText('Polygon mask active - LB pick next point, RB close polygon')
1230    elif G2frame.MaskKey == 's':
1231        G2frame.dataFrame.GetStatusBar().SetStatusText('Spot mask active - LB pick spot location')
1232    elif G2frame.MaskKey == 'a':
1233        G2frame.dataFrame.GetStatusBar().SetStatusText('Arc mask active - LB pick arc location')
1234    elif G2frame.MaskKey == 'r':
1235        G2frame.dataFrame.GetStatusBar().SetStatusText('Ring mask active - LB pick ring location')
1236    else:
1237        G2frame.dataFrame.GetStatusBar().SetStatusText("To add mask: On 2D Powder Image, key a:arc, r:ring, s:spot, p:polygon, f:frame")
1238    G2frame.dataDisplay = wx.Panel(G2frame.dataFrame)
1239    mainSizer = wx.BoxSizer(wx.VERTICAL)
1240    mainSizer.Add((5,10),0)
1241
1242    thresh = data['Thresholds']         #min/max intensity range
1243    spots = data['Points']               #x,y,radius in mm
1244    rings = data['Rings']               #radius, thickness
1245    polygons = data['Polygons']         #3+ x,y pairs
1246    if 'Frames' not in data:
1247        data['Frames'] = []
1248    frame = data['Frames']             #3+ x,y pairs
1249    arcs = data['Arcs']                 #radius, start/end azimuth, thickness
1250   
1251    littleSizer = wx.FlexGridSizer(0,3,0,5)
1252    littleSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Lower/Upper limits '),0,WACV)
1253    Text = wx.TextCtrl(G2frame.dataDisplay,value=("%8d" % (thresh[0][0])),style=wx.TE_READONLY)
1254    littleSizer.Add(Text,0,WACV)
1255    Text.SetBackgroundColour(VERY_LIGHT_GREY)
1256    Text = wx.TextCtrl(G2frame.dataDisplay,value=("%8d" % (thresh[0][1])),style=wx.TE_READONLY)
1257    littleSizer.Add(Text,0,WACV)
1258    Text.SetBackgroundColour(VERY_LIGHT_GREY)
1259    littleSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Lower/Upper thresholds '),0,WACV)
1260    lowerThreshold = wx.TextCtrl(parent=G2frame.dataDisplay,
1261        value=("%8d" % (thresh[1][0])),style=wx.TE_PROCESS_ENTER)
1262    lowerThreshold.Bind(wx.EVT_TEXT_ENTER,OnThreshold)
1263    lowerThreshold.Bind(wx.EVT_KILL_FOCUS,OnThreshold)
1264    littleSizer.Add(lowerThreshold,0,WACV)
1265    upperThreshold = wx.TextCtrl(parent=G2frame.dataDisplay,
1266        value=("%8d" % (thresh[1][1])),style=wx.TE_PROCESS_ENTER)
1267    upperThreshold.Bind(wx.EVT_TEXT_ENTER,OnThreshold)
1268    upperThreshold.Bind(wx.EVT_KILL_FOCUS,OnThreshold)
1269    littleSizer.Add(upperThreshold,0,WACV)
1270    mainSizer.Add(littleSizer,0,)
1271    spotIds = []
1272    delSpotId = []
1273    if spots:
1274        littleSizer = wx.FlexGridSizer(0,3,0,5)
1275        littleSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Spot masks:'),0,WACV)
1276        littleSizer.Add((5,0),0)
1277        littleSizer.Add((5,0),0)
1278        littleSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' position, mm'),0,WACV)
1279        littleSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' diameter, mm'),0,WACV)
1280        littleSizer.Add((5,0),0)
1281        for spot in spots:
1282            if spot:
1283                x,y,d = spot
1284                spotText = wx.TextCtrl(parent=G2frame.dataDisplay,value=("%.2f,%.2f" % (x,y)),
1285                    style=wx.TE_READONLY)
1286                spotText.SetBackgroundColour(VERY_LIGHT_GREY)
1287                littleSizer.Add(spotText,0,WACV)
1288                spotText.Bind(wx.EVT_ENTER_WINDOW,OnTextMsg)
1289                spotDiameter = wx.TextCtrl(parent=G2frame.dataDisplay,value=("%.2f" % (d)),
1290                    style=wx.TE_PROCESS_ENTER)
1291                littleSizer.Add(spotDiameter,0,WACV)
1292                spotDiameter.Bind(wx.EVT_TEXT_ENTER,OnSpotDiameter)
1293                spotDiameter.Bind(wx.EVT_KILL_FOCUS,OnSpotDiameter)
1294                spotIds.append(spotDiameter.GetId())
1295                spotDelete = wx.CheckBox(parent=G2frame.dataDisplay,label='delete?')
1296                spotDelete.Bind(wx.EVT_CHECKBOX,OnDeleteSpot)
1297                delSpotId.append(spotDelete)
1298                littleSizer.Add(spotDelete,0,WACV)
1299        mainSizer.Add(littleSizer,0,)
1300    ringIds = []
1301    delRingId = []
1302    if rings:
1303        littleSizer = wx.FlexGridSizer(0,3,0,5)
1304        littleSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Ring masks:'),0,WACV)
1305        littleSizer.Add((5,0),0)
1306        littleSizer.Add((5,0),0)
1307        littleSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' 2-theta,deg'),0,WACV)
1308        littleSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' thickness, deg'),0,WACV)
1309        littleSizer.Add((5,0),0)
1310        for ring in rings:
1311            if ring:
1312                tth,thick = ring
1313                ringText = wx.TextCtrl(parent=G2frame.dataDisplay,value=("%.3f" % (tth)),
1314                    style=wx.TE_READONLY)
1315                ringText.SetBackgroundColour(VERY_LIGHT_GREY)
1316                ringText.Bind(wx.EVT_ENTER_WINDOW,OnTextMsg)
1317                littleSizer.Add(ringText,0,WACV)
1318                ringThick = wx.TextCtrl(parent=G2frame.dataDisplay,value=("%.3f" % (thick)),
1319                    style=wx.TE_PROCESS_ENTER)
1320                littleSizer.Add(ringThick,0,WACV)
1321                ringThick.Bind(wx.EVT_TEXT_ENTER,OnRingThickness)
1322                ringThick.Bind(wx.EVT_KILL_FOCUS,OnRingThickness)
1323                ringIds.append(ringThick.GetId())
1324                ringDelete = wx.CheckBox(parent=G2frame.dataDisplay,label='delete?')
1325                ringDelete.Bind(wx.EVT_CHECKBOX,OnDeleteRing)
1326                delRingId.append(ringDelete)
1327                littleSizer.Add(ringDelete,0,WACV)
1328        mainSizer.Add(littleSizer,0,)
1329    arcIds = []
1330    delArcId = []
1331    if arcs:
1332        littleSizer = wx.FlexGridSizer(0,4,0,5)
1333        littleSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Arc masks:'),0,WACV)
1334        littleSizer.Add((5,0),0)
1335        littleSizer.Add((5,0),0)
1336        littleSizer.Add((5,0),0)
1337        littleSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' 2-theta,deg'),0,WACV)
1338        littleSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' azimuth, deg'),0,WACV)
1339        littleSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' thickness, deg'),0,WACV)
1340        littleSizer.Add((5,0),0)
1341        for arc in arcs:
1342            if arc:
1343                tth,azimuth,thick = arc
1344                arcText = wx.TextCtrl(parent=G2frame.dataDisplay,value=("%.3f" % (tth)),
1345                    style=wx.TE_READONLY)
1346                arcText.SetBackgroundColour(VERY_LIGHT_GREY)
1347                arcText.Bind(wx.EVT_ENTER_WINDOW,OnTextMsg)
1348                littleSizer.Add(arcText,0,WACV)
1349                azmText = wx.TextCtrl(parent=G2frame.dataDisplay,value=("%d,%d" % (azimuth[0],azimuth[1])),
1350                    style=wx.TE_READONLY)
1351                azmText.SetBackgroundColour(VERY_LIGHT_GREY)
1352                azmText.Bind(wx.EVT_ENTER_WINDOW,OnTextMsg)
1353                littleSizer.Add(azmText,0,WACV)
1354                arcThick = wx.TextCtrl(parent=G2frame.dataDisplay,value=("%.3f" % (thick)),
1355                    style=wx.TE_PROCESS_ENTER)
1356                littleSizer.Add(arcThick,0,WACV)
1357                arcThick.Bind(wx.EVT_TEXT_ENTER,OnArcThickness)
1358                arcThick.Bind(wx.EVT_KILL_FOCUS,OnArcThickness)
1359                arcIds.append(arcThick.GetId())
1360                arcDelete = wx.CheckBox(parent=G2frame.dataDisplay,label='delete?')
1361                arcDelete.Bind(wx.EVT_CHECKBOX,OnDeleteArc)
1362                delArcId.append(arcDelete)
1363                littleSizer.Add(arcDelete,0,WACV)
1364        mainSizer.Add(littleSizer,0,)
1365    polyIds = []
1366    delPolyId = []
1367    delFrameId = []
1368    if polygons:
1369        littleSizer = wx.FlexGridSizer(0,2,0,5)
1370        littleSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Polygon masks:'),0,WACV)
1371        littleSizer.Add((5,0),0)
1372        for polygon in polygons:
1373            if polygon:
1374                polyList = []
1375                for x,y in polygon:
1376                    polyList.append("%.2f, %.2f"%(x,y))
1377                polyText = wx.ComboBox(G2frame.dataDisplay,value=polyList[0],choices=polyList,style=wx.CB_READONLY)
1378                littleSizer.Add(polyText,0,WACV)
1379                polyDelete = wx.CheckBox(parent=G2frame.dataDisplay,label='delete?')
1380                polyDelete.Bind(wx.EVT_CHECKBOX,OnDeletePoly)
1381                delPolyId.append(polyDelete)
1382                littleSizer.Add(polyDelete,0,WACV)
1383        mainSizer.Add(littleSizer,0,)
1384    if frame:
1385        littleSizer = wx.FlexGridSizer(0,2,0,5)
1386        littleSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Frame mask:'),0,
1387            WACV)
1388        littleSizer.Add((5,0),0)
1389        frameList = []
1390        for x,y in frame:
1391            frameList.append("%.2f, %.2f"%(x,y))
1392        frameText = wx.ComboBox(G2frame.dataDisplay,value=frameList[0],choices=frameList,style=wx.CB_READONLY)
1393        littleSizer.Add(frameText,0,WACV)
1394        frameDelete = wx.CheckBox(parent=G2frame.dataDisplay,label='delete?')
1395        frameDelete.Bind(wx.EVT_CHECKBOX,OnDeleteFrame)
1396        delFrameId.append(frameDelete)
1397        littleSizer.Add(frameDelete,0,WACV)
1398        mainSizer.Add(littleSizer,0,)
1399    if (frame or polygons):
1400        mainSizer.Add(wx.StaticText(G2frame.dataDisplay,
1401            label=' For frame and polygons: on plot RB vertex drag to move, LB vertex drag to insert'),0,WACV)
1402    mainSizer.Layout()   
1403    G2frame.dataDisplay.SetSizer(mainSizer)
1404    G2frame.dataDisplay.SetSize(mainSizer.Fit(G2frame.dataFrame))
1405    Size = mainSizer.Fit(G2frame.dataFrame)
1406    Size[0] = 450
1407    G2frame.dataFrame.setSizePosLeft(Size)   
1408
1409################################################################################
1410##### Stress/Strain
1411################################################################################
1412
1413def UpdateStressStrain(G2frame,data):
1414    '''Shows and handles the controls on the "Stress/Strain"
1415    data tree entry
1416    '''
1417   
1418    def OnAppendDzero(event):
1419        data['d-zero'].append({'Dset':1.0,'Dcalc':0.0,'pixLimit':10,'cutoff':1.0,
1420            'ImxyObs':[[],[]],'ImtaObs':[[],[]],'ImtaCalc':[[],[]],'Emat':[1.0,1.0,1.0]})
1421        UpdateStressStrain(G2frame,data)
1422       
1423    def OnUpdateDzero(event):
1424        for item in data['d-zero']:
1425            if item['Dcalc']:   #skip unrefined ones
1426                item['Dset'] = item['Dcalc']
1427        UpdateStressStrain(G2frame,data)
1428           
1429    def OnCopyStrSta(event):
1430        TextList = [[False,'All IMG',0,0]]
1431        Names = []
1432        if G2frame.PatternTree.GetCount():
1433            id, cookie = G2frame.PatternTree.GetFirstChild(G2frame.root)
1434            while id:
1435                name = G2frame.PatternTree.GetItemText(id)
1436                Names.append(name)
1437                if 'IMG' in name:
1438                    Data = G2frame.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(G2frame,id, 'Stress/Strain'))
1439                    if id == G2frame.Image:
1440                        Source = name
1441                    else:
1442                        TextList.append([False,name,id,Data.get('Sample load',0.0)])
1443                id, cookie = G2frame.PatternTree.GetNextChild(G2frame.root, cookie)
1444            if len(TextList) == 1:
1445                G2frame.ErrorDialog('Nothing to copy controls to','There must be more than one "IMG" pattern')
1446                return
1447            dlg = G2frame.CopyDialog(G2frame,'Copy stress/strain controls','Copy controls from '+Source+' to:',TextList)
1448            try:
1449                if dlg.ShowModal() == wx.ID_OK:
1450                    result = dlg.GetData()
1451                    if result[0][0]:
1452                        result = TextList[1:]
1453                        for item in result: item[0] = True
1454                    for i,item in enumerate(result):
1455                        ifcopy,name,id,load = item
1456                        if ifcopy:
1457                            Data = copy.deepcopy(data)
1458                            Data['Sample load'] = load
1459                            G2frame.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(G2frame,id, 'Stress/Strain'),Data)
1460            finally:
1461                dlg.Destroy()
1462
1463    def OnLoadStrSta(event):
1464        dlg = wx.FileDialog(G2frame, 'Choose stress/strain file', '.', '', 
1465            'image control files (*.strsta)|*.strsta',wx.OPEN|wx.CHANGE_DIR)
1466        try:
1467            if dlg.ShowModal() == wx.ID_OK:
1468                filename = dlg.GetPath()
1469                File = open(filename,'r')
1470                S = File.read()
1471                data = eval(S)
1472                Controls = G2frame.PatternTree.GetItemPyData(
1473                    G2gd.GetPatternTreeItemId(G2frame,G2frame.Image, 'Image Controls'))
1474                G2img.FitStrSta(G2frame.ImageZ,data,Controls)
1475                UpdateStressStrain(G2frame,data)
1476                G2plt.PlotExposedImage(G2frame,event=event)
1477                G2plt.PlotStrain(G2frame,data,newPlot=True)
1478                File.close()
1479        finally:
1480            dlg.Destroy()
1481
1482    def OnSaveStrSta(event):
1483        dlg = wx.FileDialog(G2frame, 'Choose stress/strain file', '.', '', 
1484            'image control files (*.strsta)|*.strsta',wx.FD_SAVE|wx.FD_OVERWRITE_PROMPT|wx.CHANGE_DIR)
1485        try:
1486            if dlg.ShowModal() == wx.ID_OK:
1487                filename = dlg.GetPath()
1488                File = open(filename,'w')
1489                save = {}
1490                keys = ['Type','Sample phi','Sample z','Sample load']
1491                keys2 = ['Dset','Dcalc','pixLimit','cutoff','Emat']
1492                File.write('{\n\t')
1493                for key in keys:
1494                    if key in 'Type':
1495                        File.write("'"+key+"':'"+data[key]+"',")
1496                    else:
1497                        File.write("'"+key+"':"+str(data[key])+',')
1498                File.write('\n\t'+"'d-zero':[\n")
1499                for data2 in data['d-zero']:
1500                    File.write('\t\t{')
1501                    for key in keys2:
1502                        File.write("'"+key+"':"+str(data2[key])+',')
1503                    File.write("'ImxyObs':[[],[]],'ImtaObs':[[],[]],'ImtaCalc':[[],[]]},\n")
1504                File.write('\t]\n}')
1505                File.close()
1506        finally:
1507            dlg.Destroy()
1508           
1509    def OnStrStaSample(event):
1510        filename = ''
1511        dlg = wx.FileDialog(G2frame, 'Choose multihistogram metadata text file', '.', '', 
1512            'metadata file (*.*)|*.*',wx.OPEN|wx.CHANGE_DIR)
1513        try:
1514            if dlg.ShowModal() == wx.ID_OK:
1515                filename = dlg.GetPath()
1516                File = open(filename,'r')
1517                S = File.readline()
1518                newItems = []
1519                itemNames = []
1520                Comments = []
1521                while S:
1522                    if S[0] == '#':
1523                        Comments.append(S)
1524                        S = File.readline()
1525                        continue
1526                    S = S.replace(',',' ').replace('\t',' ')
1527                    Stuff = S[:-1].split()
1528                    itemNames.append(Stuff[0])
1529                    newItems.append(Stuff[1:])
1530                    S = File.readline()               
1531                File.close()
1532        finally:
1533            dlg.Destroy()
1534        if not filename:
1535            G2frame.ErrorDialog('Nothing to do','No file selected')
1536            return
1537        dataDict = dict(zip(itemNames,newItems))
1538        ifany = False
1539        Names = [' ','Sample phi','Sample z','Sample load']
1540        dlg = G2gd.G2ColumnIDDialog( G2frame,' Choose multihistogram metadata columns:',
1541            'Select columns',Comments,Names,np.array(newItems).T)
1542        try:
1543            if dlg.ShowModal() == wx.ID_OK:
1544                colNames,newData = dlg.GetSelection()
1545                dataDict = dict(zip(itemNames,newData.T))
1546                for item in colNames:
1547                    if item != ' ':
1548                        ifany = True
1549        finally:
1550            dlg.Destroy()
1551        if not ifany:
1552            G2frame.ErrorDialog('Nothing to do','No columns identified')
1553            return
1554        histList = []
1555        item, cookie = G2frame.PatternTree.GetFirstChild(G2frame.root)       
1556        while item:
1557            name = G2frame.PatternTree.GetItemText(item)
1558            if name.startswith('IMG'):
1559                histList.append(name)
1560            item, cookie = G2frame.PatternTree.GetNextChild(G2frame.root, cookie)
1561        colIds = {}
1562        for i,name in enumerate(colNames):
1563            if name != ' ':
1564                colIds[name] = i
1565        for hist in histList:
1566            name = hist.split()[1]  #this is file name
1567            if name in dataDict:
1568                newItems = {}
1569                for item in colIds:
1570                    newItems[item] = float(dataDict[name][colIds[item]])
1571                Id = G2gd.GetPatternTreeItemId(G2frame,G2frame.root,hist)
1572                stsrData = G2frame.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(G2frame,Id,'Stress/Strain'))
1573                stsrData.update(newItems)       
1574        UpdateStressStrain(G2frame,data)       
1575   
1576    def OnFitStrSta(event):
1577        Controls = G2frame.PatternTree.GetItemPyData(
1578            G2gd.GetPatternTreeItemId(G2frame,G2frame.Image, 'Image Controls'))
1579        G2img.FitStrSta(G2frame.ImageZ,data,Controls)
1580        print 'Strain fitting finished'
1581        UpdateStressStrain(G2frame,data)
1582        G2plt.PlotExposedImage(G2frame,event=event)
1583        G2plt.PlotStrain(G2frame,data,newPlot=True)
1584       
1585    def OnFitAllStrSta(event):
1586        TextList = [[False,'All IMG',0]]
1587        Names = []
1588        if G2frame.PatternTree.GetCount():
1589            choices = G2gd.GetPatternTreeDataNames(G2frame,['IMG ',])
1590            if len(choices) == 1:
1591                G2frame.ErrorDialog('Nothing to fit','There must some "IMG" patterns')
1592                return
1593            sel = []
1594            dlg = G2gd.G2MultiChoiceDialog(G2frame,'Stress/Strain fitting','Select images to fit:',choices)
1595            dlg.SetSelections(sel)
1596            names = []
1597            if dlg.ShowModal() == wx.ID_OK:
1598                for sel in dlg.GetSelections():
1599                    names.append(choices[sel])
1600            dlg.Destroy()
1601            SeqResult = {}
1602            dlg = wx.ProgressDialog('Sequential IMG Strain fit','Data set name = '+names[0],len(names), 
1603                style = wx.PD_ELAPSED_TIME|wx.PD_AUTO_HIDE|wx.PD_REMAINING_TIME|wx.PD_CAN_ABORT)         
1604            wx.BeginBusyCursor()
1605            goodnames = []
1606            try:
1607                for i,name in enumerate(names):
1608                    print ' Sequential strain fit for ',name
1609                    GoOn = dlg.Update(i,newmsg='Data set name = '+name)[0]
1610                    if not GoOn:
1611                        break
1612                    Id =  G2gd.GetPatternTreeItemId(G2frame,G2frame.root,name)
1613                    Controls = G2frame.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(G2frame,Id, 'Image Controls'))
1614                    StaCtrls = G2frame.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(G2frame,Id, 'Stress/Strain'))
1615                    if not len(StaCtrls['d-zero']):
1616                        continue
1617                    goodnames.append(name)
1618                    id = G2gd.GetPatternTreeItemId(G2frame, G2frame.root, name)
1619                    Npix,imagefile = G2frame.PatternTree.GetItemPyData(Id)
1620                    image = G2IO.GetImageData(G2frame,imagefile,True)
1621                    dark = Controls['dark image']
1622                    if dark[0]:
1623                        darkfile = G2frame.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(G2frame, 
1624                            G2frame.root,dark[0]))[1]
1625                        darkImg = G2IO.GetImageData(G2frame,darkfile,imageOnly=True)
1626                        image += dark[1]*darkImg
1627                    G2img.FitStrSta(image,StaCtrls,Controls)
1628                    G2plt.PlotStrain(G2frame,StaCtrls,newPlot=True)
1629                    parmDict = {'Sample load':StaCtrls['Sample load'],}
1630                    varyNames = ['e11','e12','e22']
1631                    sig = []
1632                    varyList = []
1633                    variables = []
1634                    for i,item in enumerate(StaCtrls['d-zero']):
1635                        variables += item['Emat']
1636                        sig += item['Esig']
1637                        varylist = ['%d%s%s'%(i,':',Name) for Name in varyNames]
1638                        varyList += varylist
1639                        parmDict.update(dict(zip(varylist,item['Emat'])))
1640                        parmDict['%d:Dcalc'%(i)] = item['Dcalc']
1641                    SeqResult[name] = {'variables':variables,'varyList':varyList,'sig':sig,'Rvals':[],
1642                        'covMatrix':np.eye(len(variables)),'title':name,'parmDict':parmDict}
1643                else:
1644                    SeqResult['histNames'] = goodnames
1645                    dlg.Destroy()
1646                    print ' ***** Sequential strain refinement successful *****'
1647            finally:
1648                wx.EndBusyCursor()   
1649            Id =  G2gd.GetPatternTreeItemId(G2frame,G2frame.root,'Sequential results')
1650            if Id:
1651                G2frame.PatternTree.SetItemPyData(Id,SeqResult)
1652            else:
1653                Id = G2frame.PatternTree.AppendItem(parent=G2frame.root,text='Sequential results')
1654                G2frame.PatternTree.SetItemPyData(Id,SeqResult)
1655            G2frame.PatternTree.SelectItem(Id)
1656            print 'All images fitted'
1657       
1658    def SamSizer():
1659       
1660        def OnStrainType(event):
1661            data['Type'] = strType.GetValue()
1662       
1663        def OnSamPhi(event):
1664            try:
1665                value = float(samPhi.GetValue())
1666            except ValueError:
1667                value = data['Sample phi']
1668            data['Sample phi'] = value
1669            samPhi.SetValue("%.3f" % (data['Sample phi']))
1670               
1671        def OnSamZ(event):
1672            try:
1673                value = float(samZ.GetValue())
1674            except ValueError:
1675                value = data['Sample z']
1676            data['Sample z'] = value
1677            samZ.SetValue("%.3f" % (data['Sample z']))
1678               
1679        def OnSamLoad(event):
1680            try:
1681                value = float(samLoad.GetValue())
1682            except ValueError:
1683                value = data['Sample load']
1684            data['Sample load'] = value
1685            samLoad.SetValue("%.3f" % (data['Sample load']))
1686               
1687        samSizer = wx.BoxSizer(wx.HORIZONTAL)
1688        samSizer.Add(wx.StaticText(G2frame.dataDisplay,-1,label=' Strain type: '),0,WACV)
1689        strType = wx.ComboBox(G2frame.dataDisplay,value=data['Type'],choices=['True','Conventional'],
1690            style=wx.CB_READONLY|wx.CB_DROPDOWN)
1691        strType.SetValue(data['Type'])
1692        strType.Bind(wx.EVT_COMBOBOX, OnStrainType)
1693        samSizer.Add(strType,0,WACV)
1694       
1695        samSizer.Add(wx.StaticText(G2frame.dataDisplay,-1,label=' Sample phi: '),0,WACV)
1696        samPhi = wx.TextCtrl(G2frame.dataDisplay,-1,value=("%.3f" % (data['Sample phi'])),
1697            style=wx.TE_PROCESS_ENTER)
1698        samSizer.Add(samPhi,0,WACV)
1699        samPhi.Bind(wx.EVT_TEXT_ENTER,OnSamPhi)
1700        samPhi.Bind(wx.EVT_KILL_FOCUS,OnSamPhi)
1701        samSizer.Add(wx.StaticText(G2frame.dataDisplay,-1,label=' Sample delta-z(mm): '),0,WACV)
1702        samZ = wx.TextCtrl(G2frame.dataDisplay,-1,value=("%.3f" % (data['Sample z'])),
1703            style=wx.TE_PROCESS_ENTER)
1704        samSizer.Add(samZ,0,WACV)
1705        samZ.Bind(wx.EVT_TEXT_ENTER,OnSamZ)
1706        samZ.Bind(wx.EVT_KILL_FOCUS,OnSamZ)
1707        samSizer.Add(wx.StaticText(G2frame.dataDisplay,-1,label=' Sample load(MPa): '),0,WACV)
1708        samLoad = G2gd.ValidatedTxtCtrl(G2frame.dataDisplay,data,'Sample load',
1709                nDig=[8,3],typeHint=float,)
1710        samSizer.Add(samLoad,0,WACV)
1711
1712        return samSizer
1713       
1714    def DzeroSizer():
1715   
1716        def OnDzero(event):
1717            Obj = event.GetEventObject()
1718            try:
1719                value = min(20.0,max(0.25,float(Obj.GetValue())))
1720            except ValueError:
1721                value = 1.0
1722            Obj.SetValue("%.5f"%(value))
1723            data['d-zero'][Indx[Obj.GetId()]]['Dset'] = value
1724            data['d-zero'] = G2mth.sortArray(data['d-zero'],'Dset',reverse=True)
1725            Ring,R = G2img.MakeStrStaRing(data['d-zero'][Indx[Obj.GetId()]],G2frame.ImageZ,Controls)
1726            if len(Ring):
1727                data['d-zero'][Indx[Obj.GetId()]].update(R)
1728            else:
1729                G2frame.ErrorDialog('Strain peak selection','WARNING - No points found for this ring selection')
1730               
1731            UpdateStressStrain(G2frame,data)
1732            G2plt.PlotExposedImage(G2frame,event=event,newPlot=False)
1733            G2plt.PlotStrain(G2frame,data,newPlot=True)
1734           
1735        def OnDeleteDzero(event):
1736            Obj = event.GetEventObject()
1737            del(data['d-zero'][delIndx.index(Obj)])
1738            UpdateStressStrain(G2frame,data)
1739            G2plt.PlotExposedImage(G2frame,event=event,newPlot=True)
1740            G2plt.PlotStrain(G2frame,data,newPlot=True)
1741       
1742        def OnCutOff(event):
1743            Obj = event.GetEventObject()
1744            try:
1745                value = min(10.0,max(0.5,float(Obj.GetValue())))
1746            except ValueError:
1747                value = 1.0
1748            Obj.SetValue("%.1f"%(value))
1749            data['d-zero'][Indx[Obj.GetId()]]['cutoff'] = value
1750            Ring,R = G2img.MakeStrStaRing(data['d-zero'][Indx[Obj.GetId()]],G2frame.ImageZ,Controls)
1751            G2plt.PlotExposedImage(G2frame,event=event)
1752            G2plt.PlotStrain(G2frame,data,newPlot=True)
1753       
1754        def OnPixLimit(event):
1755            Obj = event.GetEventObject()
1756            data['d-zero'][Indx[Obj.GetId()]]['pixLimit'] = int(Obj.GetValue())
1757            Ring,R = G2img.MakeStrStaRing(data['d-zero'][Indx[Obj.GetId()]],G2frame.ImageZ,Controls)
1758            G2plt.PlotExposedImage(G2frame,event=event)
1759            G2plt.PlotStrain(G2frame,data,newPlot=True)
1760           
1761        Indx = {}
1762        delIndx = []   
1763        dzeroSizer = wx.FlexGridSizer(0,8,5,5)
1764        for id,dzero in enumerate(data['d-zero']):
1765            dzeroSizer.Add(wx.StaticText(G2frame.dataDisplay,-1,label=(' d-zero #%d: '%(id))),0,WACV)
1766            dZero = wx.TextCtrl(G2frame.dataDisplay,-1,value=('%.5f'%(dzero['Dset'])),
1767                style=wx.TE_PROCESS_ENTER)
1768            dzeroSizer.Add(dZero,0,WACV)
1769            dZero.Bind(wx.EVT_TEXT_ENTER,OnDzero)
1770            dZero.Bind(wx.EVT_KILL_FOCUS,OnDzero)
1771            Indx[dZero.GetId()] = id
1772            dzeroSizer.Add(wx.StaticText(G2frame.dataDisplay,-1,label=(' d-zero ave: %.5f'%(dzero['Dcalc']))),0,WACV)
1773               
1774            dzeroSizer.Add(wx.StaticText(G2frame.dataDisplay,label=' Min ring I/Ib '),0,WACV)
1775            cutOff = wx.TextCtrl(parent=G2frame.dataDisplay,value=("%.1f" % (dzero['cutoff'])),
1776                style=wx.TE_PROCESS_ENTER)
1777            cutOff.Bind(wx.EVT_TEXT_ENTER,OnCutOff)
1778            cutOff.Bind(wx.EVT_KILL_FOCUS,OnCutOff)
1779            Indx[cutOff.GetId()] = id
1780            dzeroSizer.Add(cutOff,0,WACV)
1781       
1782            dzeroSizer.Add(wx.StaticText(G2frame.dataDisplay,label=' Pixel search range '),0,WACV)
1783            pixLimit = wx.ComboBox(parent=G2frame.dataDisplay,value=str(dzero['pixLimit']),choices=['1','2','5','10','15','20'],
1784                style=wx.CB_READONLY|wx.CB_DROPDOWN)
1785            pixLimit.Bind(wx.EVT_COMBOBOX, OnPixLimit)
1786            Indx[pixLimit.GetId()] = id
1787            dzeroSizer.Add(pixLimit,0,WACV)               
1788               
1789            dzeroDelete = wx.CheckBox(parent=G2frame.dataDisplay,label='delete?')
1790            dzeroDelete.Bind(wx.EVT_CHECKBOX,OnDeleteDzero)
1791            delIndx.append(dzeroDelete)
1792            dzeroSizer.Add(dzeroDelete,0,WACV)
1793           
1794            dzeroSizer.Add(wx.StaticText(G2frame.dataDisplay,-1,label=(' Strain tensor:')),WACV)
1795            names = ['e11','e12','e22']
1796            for i in range(3):
1797                dzeroSizer.Add(wx.StaticText(G2frame.dataDisplay,-1,label=names[i]),0,WACV)
1798                tensorElem = wx.TextCtrl(G2frame.dataDisplay,-1,value='%.2f'%(dzero['Emat'][i]),style=wx.TE_READONLY)
1799                tensorElem.SetBackgroundColour(VERY_LIGHT_GREY)
1800                dzeroSizer.Add(tensorElem,0,WACV)
1801            dzeroSizer.Add((5,5),0)             
1802        return dzeroSizer
1803       
1804# patches
1805    if 'Sample load' not in data:
1806        data['Sample load'] = 0.0
1807# end patches
1808   
1809    if G2frame.dataDisplay:
1810        G2frame.dataDisplay.Destroy()
1811    Controls = G2frame.PatternTree.GetItemPyData(
1812        G2gd.GetPatternTreeItemId(G2frame,G2frame.Image, 'Image Controls'))       
1813    G2gd.SetDataMenuBar(G2frame,G2frame.dataFrame.StrStaMenu)
1814    G2frame.dataFrame.Bind(wx.EVT_MENU, OnAppendDzero, id=G2gd.wxID_APPENDDZERO)
1815    G2frame.dataFrame.Bind(wx.EVT_MENU, OnUpdateDzero, id=G2gd.wxID_UPDATEDZERO)
1816    G2frame.dataFrame.Bind(wx.EVT_MENU, OnFitStrSta, id=G2gd.wxID_STRSTAFIT)
1817    G2frame.dataFrame.Bind(wx.EVT_MENU, OnFitAllStrSta, id=G2gd.wxID_STRSTAALLFIT)
1818    G2frame.dataFrame.Bind(wx.EVT_MENU, OnCopyStrSta, id=G2gd.wxID_STRSTACOPY)
1819    G2frame.dataFrame.Bind(wx.EVT_MENU, OnLoadStrSta, id=G2gd.wxID_STRSTALOAD)
1820    G2frame.dataFrame.Bind(wx.EVT_MENU, OnSaveStrSta, id=G2gd.wxID_STRSTASAVE)
1821    G2frame.dataFrame.Bind(wx.EVT_MENU, OnStrStaSample, id=G2gd.wxID_STRSTSAMPLE)       
1822    if not G2frame.dataFrame.GetStatusBar():
1823        Status = G2frame.dataFrame.CreateStatusBar()
1824    if G2frame.StrainKey == 'a':    #probably doesn't happen
1825        G2frame.dataFrame.GetStatusBar().SetStatusText('Add strain ring active - LB pick d-zero value')
1826    else:
1827        G2frame.dataFrame.GetStatusBar().SetStatusText("To add strain data: On 2D Powder Image, key a:add ring")
1828       
1829    G2frame.dataDisplay = wxscroll.ScrolledPanel(G2frame.dataFrame)
1830    mainSizer = wx.BoxSizer(wx.VERTICAL)
1831    mainSizer.Add((5,10),0)
1832    mainSizer.Add(SamSizer())
1833    mainSizer.Add((5,10),0)
1834    mainSizer.Add(DzeroSizer())
1835   
1836    mainSizer.Layout()   
1837    G2frame.dataDisplay.SetSizer(mainSizer)
1838    G2frame.dataDisplay.SetAutoLayout(1)
1839    G2frame.dataDisplay.SetupScrolling()
1840    Size = mainSizer.Fit(G2frame.dataFrame)
1841    Size[0] += 25
1842    G2frame.dataDisplay.SetSize(Size)
1843    G2frame.dataFrame.setSizePosLeft(Size)   
Note: See TracBrowser for help on using the repository browser.