source: trunk/GSASIIimgGUI.py @ 1518

Last change on this file since 1518 was 1518, checked in by vondreele, 9 years ago

Add metadata file processing for Image stress/strain data - reads sample load & sample phi from text file.
Correction to PWDR metadata file processing

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