source: branch/MPbranch/GSASIIimgGUI.py

Last change on this file was 468, checked in by vondreele, 10 years ago

changed self to G2frame everywhere in all "sub" files that use it
fixed creation of 'bak' files
now force save of a new gpx file before 1st peak fit so
GSAS.save is put in a sensible directory

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