source: trunk/GSASIIimgGUI.py @ 582

Last change on this file since 582 was 582, checked in by vondreele, 11 years ago

fix to load image controls
fix to sph harmonics calc

  • Property svn:keywords set to Date Author Revision URL Id
File size: 49.1 KB
Line 
1#GSASII - image data display routines
2########### SVN repository information ###################
3# $Date: 2012-05-01 20:35:03 +0000 (Tue, 01 May 2012) $
4# $Author: vondreele $
5# $Revision: 582 $
6# $URL: trunk/GSASIIimgGUI.py $
7# $Id: GSASIIimgGUI.py 582 2012-05-01 20:35:03Z vondreele $
8########### SVN repository information ###################
9import wx
10import matplotlib as mpl
11import math
12import time
13import copy
14import cPickle
15import GSASIIpath
16import GSASIIimage as G2img
17import GSASIIplot as G2plt
18import GSASIIIO as G2IO
19import GSASIIgrid as G2gd
20import numpy as np
21
22VERY_LIGHT_GREY = wx.Colour(235,235,235)
23
24# trig functions in degrees
25sind = lambda x: math.sin(x*math.pi/180.)
26tand = lambda x: math.tan(x*math.pi/180.)
27cosd = lambda x: math.cos(x*math.pi/180.)
28asind = lambda x: 180.*math.asin(x)/math.pi
29
30################################################################################
31##### Image Controls
32################################################################################                   
33def UpdateImageControls(G2frame,data,masks):
34    import ImageCalibrants as calFile
35   
36# Menu items
37           
38    def OnCalibrate(event):       
39        G2frame.dataFrame.ImageEdit.Enable(id=G2gd.wxID_IMRECALIBRATE,enable=True)   
40        G2frame.dataFrame.GetStatusBar().SetStatusText('Select > 4 points on 1st used ring; LB to pick, RB on point to delete else RB to finish')
41        G2frame.ifGetRing = True
42       
43    def OnRecalibrate(event):
44        G2img.ImageRecalibrate(G2frame,data)
45        UpdateImageControls(G2frame,data,masks)
46       
47    def OnClearCalib(event):
48        data['ring'] = []
49        data['rings'] = []
50        data['ellipses'] = []
51#        G2frame.dataFrame.ImageEdit.Enable(id=G2gd.wxID_IMRECALIBRATE,enable=False)   
52        G2plt.PlotExposedImage(G2frame,event=event)
53           
54    def OnIntegrate(event):
55       
56        if data['background image'][0]:
57            maskCopy = copy.deepcopy(masks)
58            backImg = data['background image'][0]
59            backScale = data['background image'][1]
60            id = G2gd.GetPatternTreeItemId(G2frame, G2frame.root, backImg)
61            Npix,imagefile = G2frame.PatternTree.GetItemPyData(id)
62            backImage = G2IO.GetImageData(G2frame,imagefile,True)*backScale
63            sumImage = G2frame.ImageZ+backImage
64            sumMin = np.min(sumImage)
65            sumMax = np.max(sumImage)
66            maskCopy['Thresholds'] = [(sumMin,sumMax),[sumMin,sumMax]]
67            G2frame.Integrate = G2img.ImageIntegrate(sumImage,data,maskCopy)
68        else:
69            G2frame.Integrate = G2img.ImageIntegrate(G2frame.ImageZ,data,masks)
70        G2plt.PlotIntegration(G2frame,newPlot=True)
71        G2IO.SaveIntegration(G2frame,G2frame.PickId,data)
72        G2frame.MakePDF.Enable(True)
73       
74    def OnIntegrateAll(event):
75        print 'integrate all'
76        TextList = [[False,'All IMG',0]]
77        Names = []
78        if G2frame.PatternTree.GetCount():
79            id, cookie = G2frame.PatternTree.GetFirstChild(G2frame.root)
80            while id:
81                name = G2frame.PatternTree.GetItemText(id)
82                Names.append(name)
83                if 'IMG' in name:
84                    TextList.append([False,name,id])
85                id, cookie = G2frame.PatternTree.GetNextChild(G2frame.root, cookie)
86            if len(TextList) == 1:
87                G2frame.ErrorDialog('Nothing to integrate','There must some "IMG" patterns')
88                return
89            dlg = G2frame.CopyDialog(G2frame,'Image integration controls','Select images to integrate:',TextList)
90            try:
91                if dlg.ShowModal() == wx.ID_OK:
92                    result = dlg.GetData()
93                    if result[0][0]:                    #the 'All IMG' is True
94                        result = TextList[1:]
95                        for item in result: item[0] = True
96                    for item in result:
97                        ifintegrate,name,id = item
98                        if ifintegrate:
99                            id = G2gd.GetPatternTreeItemId(G2frame, G2frame.root, name)
100                            Npix,imagefile = G2frame.PatternTree.GetItemPyData(id)
101                            image = G2IO.GetImageData(G2frame,imagefile,True)
102                            Id = G2gd.GetPatternTreeItemId(G2frame,id, 'Image Controls')
103                            Data = G2frame.PatternTree.GetItemPyData(Id)
104                            backImage = []
105                            if Data['background image'][0]:
106                                backImg = Data['background image'][0]
107                                backScale = Data['background image'][1]
108                                id = G2gd.GetPatternTreeItemId(G2frame, G2frame.root, backImg)
109                                Npix,imagefile = G2frame.PatternTree.GetItemPyData(id)
110                                backImage = G2IO.GetImageData(G2frame,imagefile,True)*backScale
111                            try:
112                                Masks = G2frame.PatternTree.GetItemPyData(
113                                    G2gd.GetPatternTreeItemId(G2frame,G2frame.Image, 'Masks'))
114                            except TypeError:       #missing Masks
115                                Imin,Imax = Data['Range']
116                                Masks = {'Points':[],'Rings':[],'Arcs':[],'Polygons':[],'Thresholds':[(Imin,Imax),[Imin,Imax]]}
117                                G2frame.PatternTree.SetItemPyData(
118                                    G2gd.GetPatternTreeItemId(G2frame,G2frame.Image, 'Masks'),Masks)
119                            if len(backImage):                               
120                                G2frame.Integrate = G2img.ImageIntegrate(image+backImage,Data,Masks)
121                            else:
122                                G2frame.Integrate = G2img.ImageIntegrate(image,Data,Masks)
123#                            G2plt.PlotIntegration(G2frame,newPlot=True,event=event)
124                            G2IO.SaveIntegration(G2frame,Id,Data)
125            finally:
126                dlg.Destroy()
127       
128    def OnCopyControls(event):
129        import copy
130        TextList = [[False,'All IMG',0]]
131        Names = []
132        if G2frame.PatternTree.GetCount():
133            id, cookie = G2frame.PatternTree.GetFirstChild(G2frame.root)
134            while id:
135                name = G2frame.PatternTree.GetItemText(id)
136                Names.append(name)
137                if 'IMG' in name:
138                    if id == G2frame.Image:
139                        Source = name
140                        Data = copy.deepcopy(G2frame.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(G2frame,id, 'Image Controls')))
141                        Data['showLines'] = True
142                        Data['ring'] = []
143                        Data['rings'] = []
144                        Data['ellipses'] = []
145                        Data['setDefault'] = False
146                    else:
147                        TextList.append([False,name,id])
148                id, cookie = G2frame.PatternTree.GetNextChild(G2frame.root, cookie)
149            if len(TextList) == 1:
150                G2frame.ErrorDialog('Nothing to copy controls to','There must be more than one "IMG" pattern')
151                return
152            dlg = G2frame.CopyDialog(G2frame,'Copy image controls','Copy controls from '+Source+' to:',TextList)
153            try:
154                if dlg.ShowModal() == wx.ID_OK:
155                    result = dlg.GetData()
156                    if result[0][0]:
157                        result = TextList[1:]
158                        for item in result: item[0] = True
159                    for i,item in enumerate(result):
160                        ifcopy,name,id = item
161                        if ifcopy:
162                            oldData = copy.deepcopy(G2frame.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(G2frame,id, 'Image Controls')))
163                            Data['range'] = oldData['range']
164                            Data['size'] = oldData['size']                               
165                            Data['ring'] = []
166                            Data['rings'] = []
167                            Data['ellipses'] = []
168                            G2frame.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(G2frame,id, 'Image Controls'),copy.deepcopy(Data))
169            finally:
170                dlg.Destroy()
171               
172    def OnSaveControls(event):
173        dlg = wx.FileDialog(G2frame, 'Choose image controls file', '.', '', 
174            'image control files (*.imctrl)|*.imctrl',wx.FD_SAVE|wx.FD_OVERWRITE_PROMPT|wx.CHANGE_DIR)
175        try:
176            if dlg.ShowModal() == wx.ID_OK:
177                filename = dlg.GetPath()
178                File = open(filename,'w')
179                save = {}
180                keys = ['type','wavelength','calibrant','distance','center',
181                    'tilt','rotation','azmthOff','fullIntegrate','LRazimuth',
182                    'IOtth','outAzimuths']
183                for key in keys:
184                    if key in ['rotation']:
185                        File.write(key+':'+str(data[key]-90.)+'\n')                       
186                    else:
187                        File.write(key+':'+str(data[key])+'\n')
188                File.close()
189        finally:
190            dlg.Destroy()
191       
192    def OnLoadControls(event):
193        cntlList = ['wavelength','distance','tilt','rotation',
194            'fullIntegrate','outAzimuths','LRazimuth','IOtth']
195        dlg = wx.FileDialog(G2frame, 'Choose image controls file', '.', '', 
196            'image control files (*.imctrl)|*.imctrl',wx.OPEN|wx.CHANGE_DIR)
197        try:
198            if dlg.ShowModal() == wx.ID_OK:
199                filename = dlg.GetPath()
200                File = open(filename,'r')
201                save = {}
202                S = File.readline()
203                while S:
204                    if S[0] == '#':
205                        S = File.readline()
206                        continue
207                    [key,val] = S[:-1].split(':')
208                    if key in ['type','calibrant',]:
209                        save[key] = val
210                    elif key in ['rotation']:
211                        save[key] = float(val)+90.
212                    elif key in ['center',]:
213                        if ',' in val:
214                            save[key] = eval(val)
215                        else:
216                            vals = val.strip('[] ').split()
217                            save[key] = [float(vals[0]),float(vals[1])] 
218                    elif key in cntlList:
219                        save[key] = eval(val)
220                    S = File.readline()
221                data.update(save)
222                UpdateImageControls(G2frame,data,masks)
223                G2plt.PlotExposedImage(G2frame,event=event)
224               
225                File.close()
226        finally:
227            dlg.Destroy()
228           
229# Sizers
230                                       
231    def ComboSizer():
232
233        def OnDataType(event):
234            data['type'] = typeSel.GetValue()[:4]
235   
236        def OnNewColorBar(event):
237            data['color'] = colSel.GetValue()
238            G2plt.PlotExposedImage(G2frame,event=event)
239       
240        def OnAzmthOff(event):
241            try:
242                azmthoff = float(azmthOff.GetValue())
243                data['azmthOff'] = azmthoff
244            except ValueError:
245                pass
246            azmthOff.SetValue("%.2f"%(data['azmthOff']))          #reset in case of error 
247       
248        comboSizer = wx.BoxSizer(wx.HORIZONTAL)
249        comboSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Type of image data: '),0,
250            wx.ALIGN_CENTER_VERTICAL)
251        typeSel = wx.ComboBox(parent=G2frame.dataDisplay,value=typeDict[data['type']],choices=typeList,
252            style=wx.CB_READONLY|wx.CB_DROPDOWN)
253        typeSel.SetValue(data['type'])
254        typeSel.Bind(wx.EVT_COMBOBOX, OnDataType)
255        comboSizer.Add(typeSel,0,wx.ALIGN_CENTER_VERTICAL)
256        comboSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Color bar '),0,
257            wx.ALIGN_CENTER_VERTICAL)
258        colSel = wx.ComboBox(parent=G2frame.dataDisplay,value=data['color'],choices=colorList,
259            style=wx.CB_READONLY|wx.CB_DROPDOWN|wx.CB_SORT)
260        colSel.Bind(wx.EVT_COMBOBOX, OnNewColorBar)
261        comboSizer.Add(colSel,0,wx.ALIGN_CENTER_VERTICAL)
262        comboSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Azimuth offset '),0,
263            wx.ALIGN_CENTER_VERTICAL)
264        azmthOff = wx.TextCtrl(parent=G2frame.dataDisplay,value=("%.2f" % (data['azmthOff'])),
265            style=wx.TE_PROCESS_ENTER)
266        azmthOff.Bind(wx.EVT_TEXT_ENTER,OnAzmthOff)
267        azmthOff.Bind(wx.EVT_KILL_FOCUS,OnAzmthOff)
268        comboSizer.Add(azmthOff,0,wx.ALIGN_CENTER_VERTICAL)
269        return comboSizer
270       
271    def MaxSizer():
272               
273        def OnMaxVal(event):
274            try:
275                value = min(data['range'][0][1],int(maxVal.GetValue()))
276                if value < data['range'][1][0]+1:
277                    raise ValueError
278                data['range'][1][1] = value
279            except ValueError:
280                pass
281            maxVal.SetValue('%.0f'%(data['range'][1][1]))
282            DeltOne = data['range'][1][1]-max(0.0,data['range'][0][0])
283            sqrtDeltOne = math.sqrt(DeltOne)
284            maxSel.SetValue(int(100*sqrtDeltOne/sqrtDeltZero))
285            minSel.SetValue(int(100*(data['range'][1][0]/DeltOne)))
286            G2plt.PlotExposedImage(G2frame,event=event)
287           
288        def OnMinVal(event):
289            try:
290                value = int(minVal.GetValue())
291                if value > data['range'][1][1]-1:
292                    raise ValueError
293                data['range'][1][0] = value
294            except ValueError:
295                pass
296            minVal.SetValue('%.0f'%(data['range'][1][0]))
297            minSel.SetValue(int(100*(data['range'][1][0]-max(0.0,data['range'][0][0]))/DeltOne))
298            G2plt.PlotExposedImage(G2frame,event=event)
299           
300        def OnMaxSlider(event):
301            sqrtDeltZero = math.sqrt(data['range'][0][1])
302            imax = int(maxSel.GetValue())*sqrtDeltZero/100.
303            data['range'][1][1] = imax**2
304            data['range'][1][0] = max(0.0,min(data['range'][1][1]-1,data['range'][1][0]))
305            DeltOne = max(1.0,data['range'][1][1]-data['range'][1][0])
306            minSel.SetValue(int(100*(data['range'][1][0]/DeltOne)))
307            maxVal.SetValue('%.0f'%(data['range'][1][1]))
308            G2plt.PlotExposedImage(G2frame,event=event)
309           
310        def OnMinSlider(event):
311            DeltOne = data['range'][1][1]-data['range'][1][0]
312            imin = int(minSel.GetValue())*DeltOne/100.
313            data['range'][1][0] = max(0.0,min(data['range'][1][1]-1,imin))
314            minVal.SetValue('%.0f'%(data['range'][1][0]))
315            G2plt.PlotExposedImage(G2frame,event=event)
316           
317        maxSizer = wx.FlexGridSizer(2,3,0,5)
318        maxSizer.AddGrowableCol(1,1)
319        maxSizer.SetFlexibleDirection(wx.HORIZONTAL)
320        sqrtDeltZero = math.sqrt(data['range'][0][1]-max(0.0,data['range'][0][0]))
321        DeltOne = data['range'][1][1]-max(0.0,data['range'][0][0])
322        sqrtDeltOne = math.sqrt(DeltOne)
323        maxSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Max intensity'),0,
324            wx.ALIGN_CENTER_VERTICAL)
325        maxSel = wx.Slider(parent=G2frame.dataDisplay,style=wx.SL_HORIZONTAL,
326            value=int(100*sqrtDeltOne/sqrtDeltZero))
327        maxSizer.Add(maxSel,1,wx.EXPAND)
328        maxSel.Bind(wx.EVT_SLIDER, OnMaxSlider)
329        maxVal = wx.TextCtrl(parent=G2frame.dataDisplay,value='%.0f'%(data['range'][1][1]))
330        maxVal.Bind(wx.EVT_TEXT_ENTER,OnMaxVal)   
331        maxVal.Bind(wx.EVT_KILL_FOCUS,OnMaxVal)
332        maxSizer.Add(maxVal,0,wx.ALIGN_CENTER_VERTICAL)   
333        maxSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Min intensity'),0,
334            wx.ALIGN_CENTER_VERTICAL)
335        minSel = wx.Slider(parent=G2frame.dataDisplay,style=wx.SL_HORIZONTAL,
336            value=int(100*(data['range'][1][0]-max(0.0,data['range'][0][0]))/DeltOne))
337        maxSizer.Add(minSel,1,wx.EXPAND)
338        minSel.Bind(wx.EVT_SLIDER, OnMinSlider)
339        minVal = wx.TextCtrl(parent=G2frame.dataDisplay,value='%.0f'%(data['range'][1][0]))
340        minVal.Bind(wx.EVT_TEXT_ENTER,OnMinVal)   
341        minVal.Bind(wx.EVT_KILL_FOCUS,OnMinVal)
342        maxSizer.Add(minVal,0,wx.ALIGN_CENTER_VERTICAL)
343        return maxSizer
344       
345    def DataSizer():
346               
347        def OnIOtth(event):
348            Ltth = max(float(G2frame.InnerTth.GetValue()),0.001)
349            Utth = float(G2frame.OuterTth.GetValue())
350            if Ltth > Utth:
351                Ltth,Utth = Utth,Ltth
352            data['IOtth'] = [Ltth,Utth]
353            G2frame.InnerTth.SetValue("%8.3f" % (Ltth))
354            G2frame.OuterTth.SetValue("%8.2f" % (Utth))
355            G2plt.PlotExposedImage(G2frame,event=event)
356       
357        def OnWavelength(event):
358            try:
359                wave = float(waveSel.GetValue())
360                if wave < .01:
361                    raise ValueError
362                data['wavelength'] = wave
363            except ValueError:
364                pass
365            waveSel.SetValue("%6.5f" % (data['wavelength']))          #reset in case of error         
366       
367        def OnLRazim(event):
368            Lazm =int(G2frame.Lazim.GetValue())
369            if data['fullIntegrate']:
370               G2frame.Razim.SetValue("%6d" % (Lazm+360))
371            Razm = int(G2frame.Razim.GetValue())
372            if Lazm > Razm:
373                Lazm -= 360
374            data['LRazimuth'] = [Lazm,Razm]
375            G2plt.PlotExposedImage(G2frame,event=event)
376       
377        def OnNumOutChans(event):
378            try:
379                numChans = int(outChan.GetValue())
380                if numChans < 1:
381                    raise ValueError
382                data['outChannels'] = numChans
383            except ValueError:
384                pass
385            outChan.SetValue(str(data['outChannels']))          #reset in case of error       
386       
387        def OnNumOutAzms(event):
388            try:
389                numAzms = int(outAzim.GetValue())
390                if numAzms < 1:
391                    raise ValueError
392                data['outAzimuths'] = numAzms           
393            except ValueError:
394                pass
395            outAzim.SetValue(str(data['outAzimuths']))          #reset in case of error       
396            G2plt.PlotExposedImage(G2frame,event=event)
397       
398        def OnShowLines(event):
399            if data['showLines']:
400                data['showLines'] = False
401            else:
402                data['showLines'] = True
403            G2plt.PlotExposedImage(G2frame,event=event)
404           
405        def OnFullIntegrate(event):
406            Lazm =int(G2frame.Lazim.GetValue())
407            if data['fullIntegrate']:
408                data['fullIntegrate'] = False
409                data['LRazimuth'] = [Lazm,Lazm+20]
410            else:
411                data['fullIntegrate'] = True
412                data['LRazimuth'] = [Lazm,Lazm+360]
413            UpdateImageControls(G2frame,data,masks)
414            G2plt.PlotExposedImage(G2frame,event=event)
415           
416        def OnSetDefault(event):
417            import copy
418            if data['setDefault']:
419                G2frame.imageDefault = {}
420                data['setDefault'] = False
421            else:
422                G2frame.imageDefault = copy.copy(data)
423                data['setDefault'] = True
424               
425        def OnCenterAzm(event):
426            if data['centerAzm']:
427                data['centerAzm'] = False
428            else:
429                data['centerAzm'] = True
430            G2plt.PlotExposedImage(G2frame,event=event)
431               
432        def OnBackImage(event):
433            data['background image'][0] = backImage.GetValue()
434           
435        def OnBackMult(event):
436            try:
437                mult = float(backMult.GetValue())
438                data['background image'][1] = mult
439            except ValueError:
440                pass
441            backMult.SetValue("%.3f" % (data['background image'][1]))          #reset in case of error
442
443        dataSizer = wx.FlexGridSizer(6,4,5,5)
444        dataSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Calibration coefficients'),0,
445            wx.ALIGN_CENTER_VERTICAL)   
446        dataSizer.Add((5,0),0)
447        dataSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Integration coefficients'),0,
448            wx.ALIGN_CENTER_VERTICAL)   
449        dataSizer.Add((5,0),0)
450       
451        dataSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Beam center X,Y'),0,
452            wx.ALIGN_CENTER_VERTICAL)
453        cent = data['center']
454        centText = wx.TextCtrl(parent=G2frame.dataDisplay,value=("%8.3f,%8.3f" % (cent[0],cent[1])),style=wx.TE_READONLY)
455        centText.SetBackgroundColour(VERY_LIGHT_GREY)
456        dataSizer.Add(centText,0,wx.ALIGN_CENTER_VERTICAL)
457       
458        dataSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Inner/Outer 2-theta'),0,
459            wx.ALIGN_CENTER_VERTICAL)
460           
461        IOtth = data['IOtth']
462        littleSizer = wx.BoxSizer(wx.HORIZONTAL)
463        G2frame.InnerTth = wx.TextCtrl(parent=G2frame.dataDisplay,
464            value=("%8.3f" % (IOtth[0])),style=wx.TE_PROCESS_ENTER)
465        G2frame.InnerTth.Bind(wx.EVT_TEXT_ENTER,OnIOtth)
466        G2frame.InnerTth.Bind(wx.EVT_KILL_FOCUS,OnIOtth)
467        littleSizer.Add(G2frame.InnerTth,0,wx.ALIGN_CENTER_VERTICAL)
468        G2frame.OuterTth = wx.TextCtrl(parent=G2frame.dataDisplay,
469            value=("%8.2f" % (IOtth[1])),style=wx.TE_PROCESS_ENTER)
470        G2frame.OuterTth.Bind(wx.EVT_TEXT_ENTER,OnIOtth)
471        G2frame.OuterTth.Bind(wx.EVT_KILL_FOCUS,OnIOtth)
472        littleSizer.Add(G2frame.OuterTth,0,wx.ALIGN_CENTER_VERTICAL)
473        dataSizer.Add(littleSizer,0,)
474           
475        dataSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Wavelength'),0,
476            wx.ALIGN_CENTER_VERTICAL)
477        waveSel = wx.TextCtrl(parent=G2frame.dataDisplay,value=("%6.5f" % (data['wavelength'])),
478            style=wx.TE_PROCESS_ENTER)
479        waveSel.Bind(wx.EVT_TEXT_ENTER,OnWavelength)
480        waveSel.Bind(wx.EVT_KILL_FOCUS,OnWavelength)
481        dataSizer.Add(waveSel,0,wx.ALIGN_CENTER_VERTICAL)
482             
483        dataSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Start/End azimuth'),0,
484            wx.ALIGN_CENTER_VERTICAL)
485        LRazim = data['LRazimuth']
486        littleSizer = wx.BoxSizer(wx.HORIZONTAL)
487        G2frame.Lazim = wx.TextCtrl(parent=G2frame.dataDisplay,
488            value=("%6d" % (LRazim[0])),style=wx.TE_PROCESS_ENTER)
489        G2frame.Lazim.Bind(wx.EVT_TEXT_ENTER,OnLRazim)
490        G2frame.Lazim.Bind(wx.EVT_KILL_FOCUS,OnLRazim)
491        littleSizer.Add(G2frame.Lazim,0,wx.ALIGN_CENTER_VERTICAL)
492        G2frame.Razim = wx.TextCtrl(parent=G2frame.dataDisplay,
493            value=("%6d" % (LRazim[1])),style=wx.TE_PROCESS_ENTER)
494        G2frame.Razim.Bind(wx.EVT_TEXT_ENTER,OnLRazim)
495        G2frame.Razim.Bind(wx.EVT_KILL_FOCUS,OnLRazim)
496        if data['fullIntegrate']:
497            G2frame.Razim.Enable(False)
498            G2frame.Razim.SetBackgroundColour(VERY_LIGHT_GREY)
499            G2frame.Razim.SetValue("%6d" % (LRazim[0]+360))
500        littleSizer.Add(G2frame.Razim,0,wx.ALIGN_CENTER_VERTICAL)
501        dataSizer.Add(littleSizer,0,)
502           
503        dataSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Distance'),0,
504            wx.ALIGN_CENTER_VERTICAL)
505        distSel = wx.TextCtrl(parent=G2frame.dataDisplay,value=("%8.3f"%(data['distance'])),style=wx.TE_READONLY)
506        distSel.SetBackgroundColour(VERY_LIGHT_GREY)
507        dataSizer.Add(distSel,0,wx.ALIGN_CENTER_VERTICAL)
508   
509        dataSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' No. 2-theta/azimuth bins'),0,
510            wx.ALIGN_CENTER_VERTICAL)
511        littleSizer = wx.BoxSizer(wx.HORIZONTAL)
512        outChan = wx.TextCtrl(parent=G2frame.dataDisplay,value=str(data['outChannels']),style=wx.TE_PROCESS_ENTER)
513        outChan.Bind(wx.EVT_TEXT_ENTER,OnNumOutChans)
514        outChan.Bind(wx.EVT_KILL_FOCUS,OnNumOutChans)
515        littleSizer.Add(outChan,0,wx.ALIGN_CENTER_VERTICAL)
516        outAzim = wx.TextCtrl(parent=G2frame.dataDisplay,value=str(data['outAzimuths']),style=wx.TE_PROCESS_ENTER)
517        outAzim.Bind(wx.EVT_TEXT_ENTER,OnNumOutAzms)
518        outAzim.Bind(wx.EVT_KILL_FOCUS,OnNumOutAzms)
519        littleSizer.Add(outAzim,0,wx.ALIGN_CENTER_VERTICAL)
520        dataSizer.Add(littleSizer,0,)
521   
522        dataSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Tilt angle'),0,
523            wx.ALIGN_CENTER_VERTICAL)
524        tiltSel = wx.TextCtrl(parent=G2frame.dataDisplay,value=("%9.3f"%(data['tilt'])),style=wx.TE_READONLY)
525        tiltSel.SetBackgroundColour(VERY_LIGHT_GREY)
526        dataSizer.Add(tiltSel,0,wx.ALIGN_CENTER_VERTICAL)
527        showLines = wx.CheckBox(parent=G2frame.dataDisplay,label='Show integration limits?')
528        dataSizer.Add(showLines,0,wx.ALIGN_CENTER_VERTICAL)
529        showLines.Bind(wx.EVT_CHECKBOX, OnShowLines)
530        showLines.SetValue(data['showLines'])
531        fullIntegrate = wx.CheckBox(parent=G2frame.dataDisplay,label='Do full integration?')
532        dataSizer.Add(fullIntegrate,0,wx.ALIGN_CENTER_VERTICAL)
533        fullIntegrate.Bind(wx.EVT_CHECKBOX, OnFullIntegrate)
534        fullIntegrate.SetValue(data['fullIntegrate'])
535       
536        dataSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Tilt rotation'),0,
537            wx.ALIGN_CENTER_VERTICAL)
538        rotSel = wx.TextCtrl(parent=G2frame.dataDisplay,value=("%9.3f"%(data['rotation']-90.)),style=wx.TE_READONLY) #kluge to get rotation from vertical - see GSASIIimage
539        rotSel.SetBackgroundColour(VERY_LIGHT_GREY)
540        dataSizer.Add(rotSel,0,wx.ALIGN_CENTER_VERTICAL)
541        setDefault = wx.CheckBox(parent=G2frame.dataDisplay,label='Use as default for all images?')
542        dataSizer.Add(setDefault,0,wx.ALIGN_CENTER_VERTICAL)
543        setDefault.Bind(wx.EVT_CHECKBOX, OnSetDefault)
544        setDefault.SetValue(data['setDefault'])
545        centerAzm = wx.CheckBox(parent=G2frame.dataDisplay,label='Azimuth at bin center?')
546        dataSizer.Add(centerAzm,0,wx.ALIGN_CENTER_VERTICAL)
547        centerAzm.Bind(wx.EVT_CHECKBOX, OnCenterAzm)
548        centerAzm.SetValue(data['centerAzm'])
549       
550        dataSizer.Add(wx.StaticText(G2frame.dataDisplay,-1,' Background image'),0,wx.ALIGN_CENTER_VERTICAL)
551        Choices = ['',]+G2gd.GetPatternTreeDataNames(G2frame,['IMG ',])
552        backImage = wx.ComboBox(parent=G2frame.dataDisplay,value=data['background image'][0],choices=Choices,
553            style=wx.CB_READONLY|wx.CB_DROPDOWN)
554        backImage.Bind(wx.EVT_COMBOBOX,OnBackImage)
555        dataSizer.Add(backImage)
556        dataSizer.Add(wx.StaticText(G2frame.dataDisplay,-1,' multiplier'),0,wx.ALIGN_CENTER_VERTICAL)
557        backMult =  wx.TextCtrl(parent=G2frame.dataDisplay,value=("%.3f" % (data['background image'][1])),
558            style=wx.TE_PROCESS_ENTER)
559        backMult.Bind(wx.EVT_TEXT_ENTER,OnBackMult)
560        backMult.Bind(wx.EVT_KILL_FOCUS,OnBackMult)
561        dataSizer.Add(backMult,0,wx.ALIGN_CENTER_VERTICAL)
562        return dataSizer
563
564    def CalibSizer():
565               
566        def OnNewCalibrant(event):
567            data['calibrant'] = calSel.GetValue()
568            data['calibskip'] = calFile.Calibrants[data['calibrant']][2]
569            limits = calFile.Calibrants[data['calibrant']][3]
570            data['calibdmin'],data['pixLimit'],data['cutoff'] = limits
571            pixLimit.SetValue(str(limits[1]))
572            cutOff.SetValue('%.1f'%(limits[2]))
573            calibSkip.SetValue(str(data['calibskip']))
574            calibDmin.SetValue('%.1f'%(limits[0]))
575           
576        def OnCalibSkip(event):
577            data['calibskip'] = int(calibSkip.GetValue())
578           
579        def OnCalibDmin(event):
580            try:
581                dmin = float(calibDmin.GetValue())
582                if dmin < 0.25:
583                    raise ValueError
584                data['calibdmin'] = dmin
585            except ValueError:
586                pass
587            calibDmin.SetValue("%.2f"%(data['calibdmin']))          #reset in case of error 
588                   
589        def OnCutOff(event):
590            try:
591                cutoff = float(cutOff.GetValue())
592                if cutoff < 0.1:
593                    raise ValueError
594                data['cutoff'] = cutoff
595            except ValueError:
596                pass
597            cutOff.SetValue("%.1f"%(data['cutoff']))          #reset in case of error 
598       
599        def OnPixLimit(event):
600            data['pixLimit'] = int(pixLimit.GetValue())
601           
602        def OnSetRings(event):
603            if data['setRings']:
604                data['setRings'] = False
605            else:
606                data['setRings'] = True
607            G2plt.PlotExposedImage(G2frame,event=event)
608   
609        calibSizer = wx.FlexGridSizer(2,3,5,5)
610        comboSizer = wx.BoxSizer(wx.HORIZONTAL)   
611        comboSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Calibrant '),0,
612            wx.ALIGN_CENTER_VERTICAL)
613        calSel = wx.ComboBox(parent=G2frame.dataDisplay,value=data['calibrant'],choices=calList,
614            style=wx.CB_READONLY|wx.CB_DROPDOWN|wx.CB_SORT)
615        calSel.Bind(wx.EVT_COMBOBOX, OnNewCalibrant)
616        comboSizer.Add(calSel,0,wx.ALIGN_CENTER_VERTICAL)
617        calibSizer.Add(comboSizer,0)
618       
619        comboSizer = wx.BoxSizer(wx.HORIZONTAL)   
620        comboSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Calib lines to skip   '),0,
621            wx.ALIGN_CENTER_VERTICAL)
622        calibSkip  = wx.ComboBox(parent=G2frame.dataDisplay,value=str(data['calibskip']),choices=[str(i) for i in range(25)],
623            style=wx.CB_READONLY|wx.CB_DROPDOWN)
624        calibSkip.Bind(wx.EVT_COMBOBOX, OnCalibSkip)
625        comboSizer.Add(calibSkip,0,wx.ALIGN_CENTER_VERTICAL)
626        calibSizer.Add(comboSizer,0)
627       
628        comboSizer = wx.BoxSizer(wx.HORIZONTAL)       
629        comboSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Min calib d-spacing '),0,
630            wx.ALIGN_CENTER_VERTICAL)
631        calibDmin = wx.TextCtrl(parent=G2frame.dataDisplay,value=("%.2f" % (data['calibdmin'])),
632            style=wx.TE_PROCESS_ENTER)
633        calibDmin.Bind(wx.EVT_TEXT_ENTER,OnCalibDmin)
634        calibDmin.Bind(wx.EVT_KILL_FOCUS,OnCalibDmin)
635        comboSizer.Add(calibDmin,0,wx.ALIGN_CENTER_VERTICAL)
636        calibSizer.Add(comboSizer,0)
637       
638        comboSizer = wx.BoxSizer(wx.HORIZONTAL)
639        comboSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Min ring I/Ib '),0,
640            wx.ALIGN_CENTER_VERTICAL)
641        cutOff = wx.TextCtrl(parent=G2frame.dataDisplay,value=("%.1f" % (data['cutoff'])),
642            style=wx.TE_PROCESS_ENTER)
643        cutOff.Bind(wx.EVT_TEXT_ENTER,OnCutOff)
644        cutOff.Bind(wx.EVT_KILL_FOCUS,OnCutOff)
645        comboSizer.Add(cutOff,0,wx.ALIGN_CENTER_VERTICAL)
646        calibSizer.Add(comboSizer,0)
647       
648        comboSizer = wx.BoxSizer(wx.HORIZONTAL)
649        comboSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Pixel search range '),0,
650            wx.ALIGN_CENTER_VERTICAL)
651        pixLimit = wx.ComboBox(parent=G2frame.dataDisplay,value=str(data['pixLimit']),choices=['1','2','5','10','15','20'],
652            style=wx.CB_READONLY|wx.CB_DROPDOWN)
653        pixLimit.Bind(wx.EVT_COMBOBOX, OnPixLimit)
654        comboSizer.Add(pixLimit,0,wx.ALIGN_CENTER_VERTICAL)
655        calibSizer.Add(comboSizer,0)
656       
657        comboSizer = wx.BoxSizer(wx.HORIZONTAL)
658        setRings = wx.CheckBox(parent=G2frame.dataDisplay,label='Show ring picks?')
659        comboSizer.Add(setRings,0)
660        setRings.Bind(wx.EVT_CHECKBOX, OnSetRings)
661        setRings.SetValue(data['setRings'])
662        calibSizer.Add(comboSizer,0)
663        return calibSizer
664       
665# Image Controls main code             
666                           
667    #fix for old files:
668    if 'azmthOff' not in data:
669        data['azmthOff'] = 0.0
670    if 'background image' not in data:
671        data['background image'] = ['',1.0]
672    if 'centerAzm' not in data:
673        data['centerAzm'] = False
674    #end fix
675   
676    colorList = [m for m in mpl.cm.datad.keys() if not m.endswith("_r")]
677    calList = [m for m in calFile.Calibrants.keys()]
678    typeList = ['PWDR - powder diffraction data','SASD - small angle scattering data',
679        'REFL - reflectometry data']
680    if not data.get('type'):                        #patch for old project files
681        data['type'] = 'PWDR'
682    typeDict = {'PWDR':typeList[0],'SASD':typeList[1],'REFL':typeList[2]}
683    if G2frame.dataDisplay:
684        G2frame.dataDisplay.Destroy()
685    G2frame.dataFrame.SetMenuBar(G2frame.dataFrame.ImageMenu)
686    if not G2frame.dataFrame.GetStatusBar():
687        G2frame.dataFrame.CreateStatusBar()
688    G2frame.dataFrame.Bind(wx.EVT_MENU, OnCalibrate, id=G2gd.wxID_IMCALIBRATE)
689    G2frame.dataFrame.Bind(wx.EVT_MENU, OnRecalibrate, id=G2gd.wxID_IMRECALIBRATE)
690    G2frame.dataFrame.Bind(wx.EVT_MENU, OnClearCalib, id=G2gd.wxID_IMCLEARCALIB)
691    if not data['rings']:
692        G2frame.dataFrame.ImageEdit.Enable(id=G2gd.wxID_IMRECALIBRATE,enable=False)   
693    G2frame.dataFrame.Bind(wx.EVT_MENU, OnIntegrate, id=G2gd.wxID_IMINTEGRATE)
694    G2frame.dataFrame.Bind(wx.EVT_MENU, OnIntegrateAll, id=G2gd.wxID_INTEGRATEALL)
695    G2frame.dataFrame.Bind(wx.EVT_MENU, OnCopyControls, id=G2gd.wxID_IMCOPYCONTROLS)
696    G2frame.dataFrame.Bind(wx.EVT_MENU, OnSaveControls, id=G2gd.wxID_IMSAVECONTROLS)
697    G2frame.dataFrame.Bind(wx.EVT_MENU, OnLoadControls, id=G2gd.wxID_IMLOADCONTROLS)
698    G2frame.dataDisplay = wx.Panel(G2frame.dataFrame)
699
700    mainSizer = wx.BoxSizer(wx.VERTICAL)
701    mainSizer.Add((5,10),0)   
702    mainSizer.Add(ComboSizer(),0,wx.ALIGN_LEFT)
703    mainSizer.Add((5,5),0)           
704    mainSizer.Add(MaxSizer(),0,wx.ALIGN_LEFT|wx.EXPAND)
705   
706    mainSizer.Add((5,5),0)       
707    mainSizer.Add(DataSizer(),0)
708    mainSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Calibration controls:'),0,
709        wx.ALIGN_CENTER_VERTICAL)
710    mainSizer.Add((5,5),0)
711    mainSizer.Add(CalibSizer(),0,wx.ALIGN_CENTER_VERTICAL)
712       
713    mainSizer.Layout()   
714    G2frame.dataDisplay.SetSizer(mainSizer)
715    fitSize = mainSizer.Fit(G2frame.dataFrame)
716    G2frame.dataFrame.setSizePosLeft(fitSize)
717    G2frame.dataDisplay.SetSize(fitSize)
718   
719################################################################################
720##### Masks
721################################################################################
722   
723def UpdateMasks(G2frame,data):
724   
725    def OnTextMsg(event):
726        Obj = event.GetEventObject()
727        Obj.SetToolTipString('Drag this mask on 2D Powder Image with mouse to change ')
728       
729    def OnThreshold(event):
730        try:
731            lower = max(int(lowerThreshold.GetValue()),thresh[0][0])
732        except ValueError:
733            lower = thresh[0][0]
734        try:
735            upper = min(int(upperThreshold.GetValue()),thresh[0][1])
736        except ValueError:
737            upper = thresh[0][1]
738        data['Thresholds'][1] = [lower,upper]
739        lowerThreshold.SetValue("%8d" % (lower))
740        upperThreshold.SetValue("%8d" % (upper))
741        G2plt.PlotExposedImage(G2frame,event=event)
742       
743    def OnSpotDiameter(event):
744        Obj = event.GetEventObject()
745        try:
746            diameter = min(100.,max(0.1,float(Obj.GetValue())))
747        except ValueError:
748            diameter = 1.0
749        Obj.SetValue("%.2f"%(diameter))
750        data['Points'][spotIds.index(Obj.GetId())][2] = diameter
751        G2plt.PlotExposedImage(G2frame,event=event)
752       
753    def OnDeleteSpot(event):
754        Obj = event.GetEventObject()
755        del(data['Points'][delSpotId.index(Obj)])
756        UpdateMasks(G2frame,data)
757        G2plt.PlotExposedImage(G2frame,event=event)
758       
759    def OnRingThickness(event):
760        Obj = event.GetEventObject()
761        try:
762            thick = min(1.0,max(0.001,float(Obj.GetValue())))
763        except ValueError:
764            thick = 0.1
765        Obj.SetValue("%.3f"%(thick))
766        data['Rings'][ringIds.index(Obj.GetId())][1] = thick
767        G2plt.PlotExposedImage(G2frame,event=event)
768       
769    def OnDeleteRing(event):
770        Obj = event.GetEventObject()
771        del(data['Rings'][delRingId.index(Obj)])
772        UpdateMasks(G2frame,data)
773        G2plt.PlotExposedImage(G2frame,event=event)
774
775    def OnArcThickness(event):
776        Obj = event.GetEventObject()
777        try:
778            thick = min(20.0,max(0.001,float(Obj.GetValue())))
779        except ValueError:
780            thick = 0.1
781        Obj.SetValue("%.3f"%(thick))
782        data['Arcs'][arcIds.index(Obj.GetId())][2] = thick
783        G2plt.PlotExposedImage(G2frame,event=event)
784       
785    def OnDeleteArc(event):
786        Obj = event.GetEventObject()
787        del(data['Arcs'][delArcId.index(Obj)])
788        UpdateMasks(G2frame,data)
789        G2plt.PlotExposedImage(G2frame,event=event)
790
791    def OnDeletePoly(event):
792        Obj = event.GetEventObject()
793        del(data['Polygons'][delPolyId.index(Obj)])
794        UpdateMasks(G2frame,data)
795        G2plt.PlotExposedImage(G2frame,event=event)
796
797    def OnCopyMask(event):
798        import copy
799        TextList = [[False,'All IMG',0]]
800        Names = []
801        if G2frame.PatternTree.GetCount():
802            id, cookie = G2frame.PatternTree.GetFirstChild(G2frame.root)
803            while id:
804                name = G2frame.PatternTree.GetItemText(id)
805                Names.append(name)
806                if 'IMG' in name:
807                    if id == G2frame.Image:
808                        Source = name
809                        Mask = copy.deepcopy(G2frame.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(G2frame,id, 'Masks')))
810                        del Mask['Thresholds']
811                    else:
812                        TextList.append([False,name,id])
813                id, cookie = G2frame.PatternTree.GetNextChild(G2frame.root, cookie)
814            if len(TextList) == 1:
815                G2frame.ErrorDialog('Nothing to copy mask to','There must be more than one "IMG" pattern')
816                return
817            dlg = G2frame.CopyDialog(G2frame,'Copy mask information','Copy mask from '+Source+' to:',TextList)
818            try:
819                if dlg.ShowModal() == wx.ID_OK:
820                    result = dlg.GetData()
821                    if result[0][0]:
822                        result = TextList[1:]
823                        for item in result: item[0] = True
824                    for i,item in enumerate(result):
825                        ifcopy,name,id = item
826                        if ifcopy:
827                            mask = G2frame.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(G2frame,id, 'Masks'))
828                            mask.update(Mask)                               
829                            G2frame.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(G2frame,id, 'Masks'),copy.deepcopy(mask))
830            finally:
831                dlg.Destroy()
832               
833    def OnSaveMask(event):
834        dlg = wx.FileDialog(G2frame, 'Choose image mask file', '.', '', 
835            'image mask files (*.immask)|*.immask',wx.FD_SAVE|wx.FD_OVERWRITE_PROMPT|wx.CHANGE_DIR)
836        try:
837            if dlg.ShowModal() == wx.ID_OK:
838                filename = dlg.GetPath()
839                File = open(filename,'w')
840                save = {}
841                keys = ['Points','Rings','Arcs','Polygons','Thresholds']
842                for key in keys:
843                    File.write(key+':'+str(data[key])+'\n')
844                File.close()
845        finally:
846            dlg.Destroy()
847       
848    def OnLoadMask(event):
849        dlg = wx.FileDialog(G2frame, 'Choose image mask file', '.', '', 
850            'image mask files (*.immask)|*.immask',wx.OPEN|wx.CHANGE_DIR)
851        try:
852            if dlg.ShowModal() == wx.ID_OK:
853                filename = dlg.GetPath()
854                File = open(filename,'r')
855                save = {}
856                S = File.readline()
857                while S:
858                    if S[0] == '#':
859                        S = File.readline()
860                        continue
861                    [key,val] = S[:-1].split(':')
862                    if key in ['Points','Rings','Arcs','Polygons','Thresholds']:
863                        save[key] = eval(val)
864                    S = File.readline()
865                data.update(save)
866                UpdateMasks(G2frame,data)
867                G2plt.PlotExposedImage(G2frame,event=event)
868               
869                File.close()
870        finally:
871            dlg.Destroy()
872       
873    if G2frame.dataDisplay:
874        G2frame.dataDisplay.Destroy()
875    G2frame.dataFrame.SetMenuBar(G2frame.dataFrame.MaskMenu)
876    G2frame.dataFrame.Bind(wx.EVT_MENU, OnCopyMask, id=G2gd.wxID_MASKCOPY)
877    G2frame.dataFrame.Bind(wx.EVT_MENU, OnLoadMask, id=G2gd.wxID_MASKLOAD)
878    G2frame.dataFrame.Bind(wx.EVT_MENU, OnSaveMask, id=G2gd.wxID_MASKSAVE)   
879    if not G2frame.dataFrame.GetStatusBar():
880        Status = G2frame.dataFrame.CreateStatusBar()
881        Status.SetStatusText("To add mask: On 2D Powder Image, key a:arc, r:ring, s:spot, p:polygon")
882    G2frame.dataDisplay = wx.Panel(G2frame.dataFrame)
883    mainSizer = wx.BoxSizer(wx.VERTICAL)
884    mainSizer.Add((5,10),0)
885
886    thresh = data['Thresholds']         #min/max intensity range
887    spots = data['Points']               #x,y,radius in mm
888    rings = data['Rings']               #radius, thickness
889    polygons = data['Polygons']         #3+ x,y pairs
890    arcs = data['Arcs']                 #radius, start/end azimuth, thickness
891   
892    littleSizer = wx.FlexGridSizer(2,3,0,5)
893    littleSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Lower/Upper limits '),0,
894        wx.ALIGN_CENTER_VERTICAL)
895    Text = wx.TextCtrl(G2frame.dataDisplay,value=("%8d" % (thresh[0][0])),style=wx.TE_READONLY)
896    littleSizer.Add(Text,0,wx.ALIGN_CENTER_VERTICAL)
897    Text.SetBackgroundColour(VERY_LIGHT_GREY)
898    Text = wx.TextCtrl(G2frame.dataDisplay,value=("%8d" % (thresh[0][1])),style=wx.TE_READONLY)
899    littleSizer.Add(Text,0,wx.ALIGN_CENTER_VERTICAL)
900    Text.SetBackgroundColour(VERY_LIGHT_GREY)
901    littleSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Lower/Upper thresholds '),
902        0,wx.ALIGN_CENTER_VERTICAL)
903    lowerThreshold = wx.TextCtrl(parent=G2frame.dataDisplay,
904        value=("%8d" % (thresh[1][0])),style=wx.TE_PROCESS_ENTER)
905    lowerThreshold.Bind(wx.EVT_TEXT_ENTER,OnThreshold)
906    lowerThreshold.Bind(wx.EVT_KILL_FOCUS,OnThreshold)
907    littleSizer.Add(lowerThreshold,0,wx.ALIGN_CENTER_VERTICAL)
908    upperThreshold = wx.TextCtrl(parent=G2frame.dataDisplay,
909        value=("%8d" % (thresh[1][1])),style=wx.TE_PROCESS_ENTER)
910    upperThreshold.Bind(wx.EVT_TEXT_ENTER,OnThreshold)
911    upperThreshold.Bind(wx.EVT_KILL_FOCUS,OnThreshold)
912    littleSizer.Add(upperThreshold,0,wx.ALIGN_CENTER_VERTICAL)
913    mainSizer.Add(littleSizer,0,)
914    spotIds = []
915    delSpotId = []
916    if spots:
917        littleSizer = wx.FlexGridSizer(len(spots)+2,3,0,5)
918        littleSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Spot masks:'),0,
919            wx.ALIGN_CENTER_VERTICAL)
920        littleSizer.Add((5,0),0)
921        littleSizer.Add((5,0),0)
922        littleSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' position, mm'),0,
923            wx.ALIGN_CENTER_VERTICAL)
924        littleSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' diameter, mm'),0,
925            wx.ALIGN_CENTER_VERTICAL)
926        littleSizer.Add((5,0),0)
927        for x,y,d in spots:
928            spotText = wx.TextCtrl(parent=G2frame.dataDisplay,value=("%.2f,%.2f" % (x,y)),
929                style=wx.TE_READONLY)
930            spotText.SetBackgroundColour(VERY_LIGHT_GREY)
931            littleSizer.Add(spotText,0,wx.ALIGN_CENTER_VERTICAL)
932            spotText.Bind(wx.EVT_ENTER_WINDOW,OnTextMsg)
933            spotDiameter = wx.TextCtrl(parent=G2frame.dataDisplay,value=("%.2f" % (d)),
934                style=wx.TE_PROCESS_ENTER)
935            littleSizer.Add(spotDiameter,0,wx.ALIGN_CENTER_VERTICAL)
936            spotDiameter.Bind(wx.EVT_TEXT_ENTER,OnSpotDiameter)
937            spotDiameter.Bind(wx.EVT_KILL_FOCUS,OnSpotDiameter)
938            spotIds.append(spotDiameter.GetId())
939            spotDelete = wx.CheckBox(parent=G2frame.dataDisplay,label='delete?')
940            spotDelete.Bind(wx.EVT_CHECKBOX,OnDeleteSpot)
941            delSpotId.append(spotDelete)
942            littleSizer.Add(spotDelete,0,wx.ALIGN_CENTER_VERTICAL)
943        mainSizer.Add(littleSizer,0,)
944    ringIds = []
945    delRingId = []
946    if rings:
947        littleSizer = wx.FlexGridSizer(len(rings)+2,3,0,5)
948        littleSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Ring masks:'),0,
949            wx.ALIGN_CENTER_VERTICAL)
950        littleSizer.Add((5,0),0)
951        littleSizer.Add((5,0),0)
952        littleSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' 2-theta,deg'),0,
953            wx.ALIGN_CENTER_VERTICAL)
954        littleSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' thickness, deg'),0,
955            wx.ALIGN_CENTER_VERTICAL)
956        littleSizer.Add((5,0),0)
957        for tth,thick in rings:
958            ringText = wx.TextCtrl(parent=G2frame.dataDisplay,value=("%.3f" % (tth)),
959                style=wx.TE_READONLY)
960            ringText.SetBackgroundColour(VERY_LIGHT_GREY)
961            ringText.Bind(wx.EVT_ENTER_WINDOW,OnTextMsg)
962            littleSizer.Add(ringText,0,wx.ALIGN_CENTER_VERTICAL)
963            ringThick = wx.TextCtrl(parent=G2frame.dataDisplay,value=("%.3f" % (thick)),
964                style=wx.TE_PROCESS_ENTER)
965            littleSizer.Add(ringThick,0,wx.ALIGN_CENTER_VERTICAL)
966            ringThick.Bind(wx.EVT_TEXT_ENTER,OnRingThickness)
967            ringThick.Bind(wx.EVT_KILL_FOCUS,OnRingThickness)
968            ringIds.append(ringThick.GetId())
969            ringDelete = wx.CheckBox(parent=G2frame.dataDisplay,label='delete?')
970            ringDelete.Bind(wx.EVT_CHECKBOX,OnDeleteRing)
971            delRingId.append(ringDelete)
972            littleSizer.Add(ringDelete,0,wx.ALIGN_CENTER_VERTICAL)
973        mainSizer.Add(littleSizer,0,)
974    arcIds = []
975    delArcId = []
976    if arcs:
977        littleSizer = wx.FlexGridSizer(len(rings)+2,4,0,5)
978        littleSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Arc masks:'),0,
979            wx.ALIGN_CENTER_VERTICAL)
980        littleSizer.Add((5,0),0)
981        littleSizer.Add((5,0),0)
982        littleSizer.Add((5,0),0)
983        littleSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' 2-theta,deg'),0,
984            wx.ALIGN_CENTER_VERTICAL)
985        littleSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' azimuth, deg'),0,
986            wx.ALIGN_CENTER_VERTICAL)
987        littleSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' thickness, deg'),0,
988            wx.ALIGN_CENTER_VERTICAL)
989        littleSizer.Add((5,0),0)
990        for tth,azimuth,thick in arcs:
991            arcText = wx.TextCtrl(parent=G2frame.dataDisplay,value=("%.3f" % (tth)),
992                style=wx.TE_READONLY)
993            arcText.SetBackgroundColour(VERY_LIGHT_GREY)
994            arcText.Bind(wx.EVT_ENTER_WINDOW,OnTextMsg)
995            littleSizer.Add(arcText,0,wx.ALIGN_CENTER_VERTICAL)
996            azmText = wx.TextCtrl(parent=G2frame.dataDisplay,value=("%d,%d" % (azimuth[0],azimuth[1])),
997                style=wx.TE_READONLY)
998            azmText.SetBackgroundColour(VERY_LIGHT_GREY)
999            azmText.Bind(wx.EVT_ENTER_WINDOW,OnTextMsg)
1000            littleSizer.Add(azmText,0,wx.ALIGN_CENTER_VERTICAL)
1001            arcThick = wx.TextCtrl(parent=G2frame.dataDisplay,value=("%.3f" % (thick)),
1002                style=wx.TE_PROCESS_ENTER)
1003            littleSizer.Add(arcThick,0,wx.ALIGN_CENTER_VERTICAL)
1004            arcThick.Bind(wx.EVT_TEXT_ENTER,OnArcThickness)
1005            arcThick.Bind(wx.EVT_KILL_FOCUS,OnArcThickness)
1006            arcIds.append(arcThick.GetId())
1007            arcDelete = wx.CheckBox(parent=G2frame.dataDisplay,label='delete?')
1008            arcDelete.Bind(wx.EVT_CHECKBOX,OnDeleteArc)
1009            delArcId.append(arcDelete)
1010            littleSizer.Add(arcDelete,0,wx.ALIGN_CENTER_VERTICAL)
1011        mainSizer.Add(littleSizer,0,)
1012    polyIds = []
1013    delPolyId = []
1014    if polygons:
1015        littleSizer = wx.FlexGridSizer(len(polygons)+2,2,0,5)
1016        littleSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Polygon masks:'),0,
1017            wx.ALIGN_CENTER_VERTICAL)
1018        littleSizer.Add((5,0),0)
1019        for polygon in polygons:
1020            if polygon:
1021                polyList = []
1022                for x,y in polygon:
1023                    polyList.append("%.2f, %.2f"%(x,y))
1024                polyText = wx.ComboBox(G2frame.dataDisplay,value=polyList[0],choices=polyList,style=wx.CB_READONLY)
1025                littleSizer.Add(polyText,0,wx.ALIGN_CENTER_VERTICAL)
1026                polyDelete = wx.CheckBox(parent=G2frame.dataDisplay,label='delete?')
1027                polyDelete.Bind(wx.EVT_CHECKBOX,OnDeletePoly)
1028                delPolyId.append(polyDelete)
1029                littleSizer.Add(polyDelete,0,wx.ALIGN_CENTER_VERTICAL)
1030        mainSizer.Add(littleSizer,0,)
1031    mainSizer.Layout()   
1032    G2frame.dataDisplay.SetSizer(mainSizer)
1033    G2frame.dataDisplay.SetSize(mainSizer.Fit(G2frame.dataFrame))
1034    G2frame.dataFrame.setSizePosLeft(mainSizer.Fit(G2frame.dataFrame))   
Note: See TracBrowser for help on using the repository browser.