source: trunk/GSASIIimgGUI.py @ 102

Last change on this file since 102 was 98, checked in by vondreel, 12 years ago

new fortran polymask used

File size: 31.6 KB
Line 
1#GSASII - image data display routines
2import wx
3import wx.grid as wg
4import matplotlib as mpl
5import math
6import time
7import cPickle
8import GSASIIpath
9import GSASIIimage as G2img
10import GSASIIplot as G2plt
11import GSASIIIO as G2IO
12import GSASIIgrid as G2gd
13
14VERY_LIGHT_GREY = wx.Colour(235,235,235)
15
16# trig functions in degrees
17sind = lambda x: math.sin(x*math.pi/180.)
18tand = lambda x: math.tan(x*math.pi/180.)
19cosd = lambda x: math.cos(x*math.pi/180.)
20asind = lambda x: 180.*math.asin(x)/math.pi
21
22def UpdateImageControls(self,data,masks):
23    import ImageCalibrants as calFile
24   
25    def OnNewColorBar(event):
26        data['color'] = colSel.GetValue()
27        G2plt.PlotExposedImage(self)
28       
29    def OnNewCalibrant(event):
30        data['calibrant'] = calSel.GetValue()
31       
32    def OnPixLimit(event):
33        data['pixLimit'] = int(pixLimit.GetValue())
34       
35    def OnMaxSlider(event):
36        logDeltZero = math.sqrt(data['range'][0][1]-data['range'][0][0])
37        imax = int(maxSel.GetValue())*logDeltZero/100.
38        data['range'][1][1] = imax**2+data['range'][0][0]
39        data['range'][1][0] = min(data['range'][1][1]-1,data['range'][1][0])
40        G2plt.PlotExposedImage(self)
41       
42    def OnMinSlider(event):
43        DeltOne = data['range'][1][1]-data['range'][0][0]
44        imin = int(minSel.GetValue())*DeltOne/100.
45        data['range'][1][0] = min(data['range'][1][1]-1,imin+data['range'][0][0])
46        G2plt.PlotExposedImage(self)
47       
48    def OnNumOutChans(event):
49        try:
50            numChans = int(outChan.GetValue())
51            if numChans < 1:
52                raise ValueError
53            data['outChannels'] = numChans
54        except ValueError:
55            pass
56        self.dataFrame.ImageEdit.Enable(id=G2gd.wxID_SAVEINTG,enable=False)   
57        outChan.SetValue(str(data['outChannels']))          #reset in case of error       
58       
59    def OnNumOutAzms(event):
60        try:
61            numAzms = int(outAzim.GetValue())
62            if numAzms < 1:
63                raise ValueError
64            data['outAzimuths'] = numAzms           
65        except ValueError:
66            pass
67        self.dataFrame.ImageEdit.Enable(id=G2gd.wxID_SAVEINTG,enable=False)   
68        outAzim.SetValue(str(data['outAzimuths']))          #reset in case of error       
69       
70    def OnWavelength(event):
71        try:
72            wave = float(waveSel.GetValue())
73            if wave < .01:
74                raise ValueError
75            data['wavelength'] = wave
76        except ValueError:
77            pass
78        waveSel.SetValue("%6.5f" % (data['wavelength']))          #reset in case of error         
79       
80    def OnCutOff(event):
81        try:
82            cutoff = float(cutOff.GetValue())
83            data['cutoff'] = cutoff
84        except ValueError:
85            pass
86        cutOff.SetValue("%.1f"%(data['cutoff']))          #reset in case of error 
87       
88    def OnShowLines(event):
89        if data['showLines']:
90            data['showLines'] = False
91        else:
92            data['showLines'] = True
93        G2plt.PlotExposedImage(self)
94       
95    def OnFullIntegrate(event):
96        if data['fullIntegrate']:
97            data['fullIntegrate'] = False
98            self.Lazim.SetEditable(True)           
99            self.Razim.SetEditable(True)           
100        else:
101            data['fullIntegrate'] = True
102            self.Lazim.SetEditable(False)           
103            self.Razim.SetEditable(False)           
104        self.dataFrame.ImageEdit.Enable(id=G2gd.wxID_SAVEINTG,enable=False)   
105        G2plt.PlotExposedImage(self)
106       
107    def OnSetDefault(event):
108        import copy
109        if data['setDefault']:
110            self.imageDefault = {}
111            data['setDefault'] = False
112        else:
113            self.imageDefault = copy.copy(data)
114            data['setDefault'] = True
115           
116    def OnIOtth(event):
117        Ltth = float(self.InnerTth.GetValue())
118        Utth = float(self.OuterTth.GetValue())
119        if Ltth > Utth:
120            Ltth,Utth = Utth,Ltth
121        data['IOtth'] = [Ltth,Utth]
122        self.InnerTth.SetValue("%8.2f" % (Ltth))
123        self.OuterTth.SetValue("%8.2f" % (Utth))
124        self.dataFrame.ImageEdit.Enable(id=G2gd.wxID_SAVEINTG,enable=False)   
125        G2plt.PlotExposedImage(self)
126       
127    def OnLRazim(event):
128        Lazm = int(self.Lazim.GetValue())
129        Razm = int(self.Razim.GetValue())
130        data['LRazimuth'] = [Lazm,Razm]
131        self.dataFrame.ImageEdit.Enable(id=G2gd.wxID_SAVEINTG,enable=False)   
132        G2plt.PlotExposedImage(self)
133           
134    def OnSetRings(event):
135        if data['setRings']:
136            data['setRings'] = False
137        else:
138            data['setRings'] = True
139        setRings.SetValue(data['setRings'])
140        G2plt.PlotExposedImage(self)
141           
142    def OnClearCalib(event):
143        data['ring'] = []
144        data['rings'] = []
145        data['ellipses'] = []
146        self.dataFrame.ImageEdit.Enable(id=G2gd.wxID_IMCLEARCALIB,enable=False)   
147        G2plt.PlotExposedImage(self)
148           
149    def OnCalibrate(event):       
150        data['setRings'] = False
151        setRings.SetValue(data['setRings'])
152        msg = \
153        '''Select > 4 points on 1st used ring of image pattern.
154        Click right mouse button to select point.
155          Use left mouse button to delete point.
156                 Press OK when done'''
157        dlg = wx.MessageDialog(self,msg,'Pick inner ring',wx.OK)
158        self.ifGetRing = True
159        dlg.ShowModal()
160        self.ifGetRing = False
161       
162        if G2img.ImageCalibrate(self,data):
163            Status.SetStatusText('Calibration successful')
164            cent = data['center']
165            centText.SetValue(("%8.3f,%8.3f" % (cent[0],cent[1])))
166            distSel.SetValue("%8.3f"%(data['distance']))
167            tiltSel.SetValue("%9.3f"%(data['tilt']))           
168            rotSel.SetValue("%9.3f"%(data['rotation']))
169            self.dataFrame.ImageEdit.Enable(id=G2gd.wxID_IMCLEARCALIB,enable=True)   
170        else:
171            Status.SetStatusText('Calibration failed')
172                   
173    def OnIntegrate(event):
174        G2img.ImageIntegrate(self,data,masks)
175        G2plt.PlotIntegration(self,newPlot=True)
176        self.dataFrame.ImageEdit.Enable(id=G2gd.wxID_SAVEINTG,enable=True)
177       
178    def OnIntegrateAll(event):
179        print 'integrate all'
180        TextList = []
181        Names = []
182        if self.PatternTree.GetCount():
183            id, cookie = self.PatternTree.GetFirstChild(self.root)
184            while id:
185                name = self.PatternTree.GetItemText(id)
186                Names.append(name)
187                if 'IMG' in name:
188                    TextList.append([False,name,id])
189                id, cookie = self.PatternTree.GetNextChild(self.root, cookie)
190            if not len(TextList):
191                self.ErrorDialog('Nothing to integrate','There must some "IMG" patterns')
192                return
193            dlg = self.CopyDialog(self,'Image integration controls','Select images to integrate:',TextList)
194            try:
195                if dlg.ShowModal() == wx.ID_OK:
196                    result = dlg.GetData()
197                    for item in result:
198                        ifintegrate,name,id = item
199                        if ifintegrate:
200                            id = G2gd.GetPatternTreeItemId(self, self.root, name)
201                            size,imagefile = self.PatternTree.GetItemPyData(id)
202                            self.ImageZ = G2IO.GetImageData(imagefile,imageOnly=True)
203                            Id = G2gd.GetPatternTreeItemId(self,id, 'Image Controls')
204                            Data = self.PatternTree.GetItemPyData(Id)
205                            try:
206                                Masks = self.PatternTree.GetItemPyData(
207                                    G2gd.GetPatternTreeItemId(self,self.Image, 'Masks'))
208                            except TypeError:       #missing Masks
209                                Imin,Imax = Data['Range']
210                                Masks = {'Points':[],'Rings':[],'Arcs':[],'Polygons':[],'Thresholds':[(Imin,Imax),[Imin,Imax]]}
211                                self.PatternTree.SetItemPyData(
212                                    G2gd.GetPatternTreeItemId(self,self.Image, 'Masks'),Masks)                               
213                            G2img.ImageIntegrate(self,Data,Masks)
214                            G2plt.PlotIntegration(self,newPlot=True)
215                            self.dataFrame.ImageEdit.Enable(id=G2gd.wxID_SAVEINTG,enable=True)
216                            G2IO.SaveIntegration(self,Id,Data)
217            finally:
218                dlg.Destroy()
219       
220    def OnSaveIntegrate(event):
221        print 'save integration'
222        G2IO.SaveIntegration(self,self.PickId,data)
223           
224    def OnCopyControls(event):
225        TextList = []
226        Names = []
227        if self.PatternTree.GetCount():
228            id, cookie = self.PatternTree.GetFirstChild(self.root)
229            while id:
230                name = self.PatternTree.GetItemText(id)
231                Names.append(name)
232                if 'IMG' in name:
233                    if id == self.Image:
234                        Source = name
235                        Data = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,id, 'Image Controls'))
236                        Data['showLines'] = True
237                        Data['ring'] = []
238                        Data['rings'] = []
239                        Data['cutoff'] = 10
240                        Data['pixLimit'] = 20
241                        Data['ellipses'] = []
242                        Data['calibrant'] = ''
243                        Data['setDefault'] = False
244                    else:
245                        TextList.append([False,name,id])
246                id, cookie = self.PatternTree.GetNextChild(self.root, cookie)
247            if not len(TextList):
248                self.ErrorDialog('Nothing to copy controls to','There must be more than one "IMG" pattern')
249                return
250            dlg = self.CopyDialog(self,'Copy image controls','Copy controls from '+Source+' to:',TextList)
251            try:
252                if dlg.ShowModal() == wx.ID_OK:
253                    result = dlg.GetData()
254                    for i,item in enumerate(result):
255                        ifcopy,name,id = item
256                        if ifcopy:
257                            oldData = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,id, 'Image Controls'))
258                            Data['range'] = oldData['range']                               
259                            self.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(self,id, 'Image Controls'),Data)
260            finally:
261                dlg.Destroy()
262                                       
263    colorList = [m for m in mpl.cm.datad.keys() if not m.endswith("_r")]
264    calList = [m for m in calFile.Calibrants.keys()]
265    if self.dataDisplay:
266        self.dataDisplay.Destroy()
267    self.dataFrame.SetMenuBar(self.dataFrame.ImageMenu)
268    if not self.dataFrame.GetStatusBar():
269        Status = self.dataFrame.CreateStatusBar()
270    self.dataFrame.Bind(wx.EVT_MENU, OnCalibrate, id=G2gd.wxID_IMCALIBRATE)
271    self.dataFrame.Bind(wx.EVT_MENU, OnClearCalib, id=G2gd.wxID_IMCLEARCALIB)
272    if not data['rings']:
273        self.dataFrame.ImageEdit.Enable(id=G2gd.wxID_IMCLEARCALIB,enable=False)   
274    self.dataFrame.Bind(wx.EVT_MENU, OnIntegrate, id=G2gd.wxID_IMINTEGRATE)
275    self.dataFrame.Bind(wx.EVT_MENU, OnIntegrateAll, id=G2gd.wxID_INTEGRATEALL)
276    self.dataFrame.Bind(wx.EVT_MENU, OnSaveIntegrate, id=G2gd.wxID_SAVEINTG)
277    self.dataFrame.Bind(wx.EVT_MENU, OnCopyControls, id=G2gd.wxID_IMCOPYCONTROLS)
278    self.dataFrame.ImageEdit.Enable(id=G2gd.wxID_SAVEINTG,enable=False)   
279    self.dataDisplay = wx.Panel(self.dataFrame)
280    mainSizer = wx.BoxSizer(wx.VERTICAL)
281    mainSizer.Add((5,10),0)
282   
283    maxSizer = wx.FlexGridSizer(2,2,0,5)
284    maxSizer.AddGrowableCol(1,1)
285    logDeltZero = math.log(data['range'][0][1]-data['range'][0][0])
286    DeltOne = data['range'][1][1]-data['range'][0][0]
287    logDeltOne = math.sqrt(DeltOne)
288    maxSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Max intensity'),0,
289        wx.ALIGN_CENTER_VERTICAL|wx.EXPAND)
290    maxSel = wx.Slider(parent=self.dataDisplay,style=wx.SL_HORIZONTAL,
291        value=int(100*logDeltOne/logDeltZero))
292    maxSizer.Add(maxSel,1,wx.EXPAND|wx.RIGHT)
293    maxSel.Bind(wx.EVT_SLIDER, OnMaxSlider)   
294    maxSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Min intensity'),0,
295        wx.ALIGN_CENTER_VERTICAL|wx.EXPAND)
296    minSel = wx.Slider(parent=self.dataDisplay,style=wx.SL_HORIZONTAL,
297        value=int(100*data['range'][1][0]/DeltOne))
298    maxSizer.Add(minSel,1,wx.EXPAND|wx.RIGHT)
299    minSel.Bind(wx.EVT_SLIDER, OnMinSlider)
300    mainSizer.Add(maxSizer,1,wx.EXPAND|wx.RIGHT)
301   
302    comboSizer = wx.BoxSizer(wx.HORIZONTAL)
303    comboSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Color bar '),0,
304        wx.ALIGN_CENTER_VERTICAL)
305    colSel = wx.ComboBox(parent=self.dataDisplay,value=data['color'],choices=colorList,
306        style=wx.CB_READONLY|wx.CB_DROPDOWN|wx.CB_SORT)
307    colSel.Bind(wx.EVT_COMBOBOX, OnNewColorBar)
308    comboSizer.Add(colSel,0,wx.ALIGN_CENTER_VERTICAL)
309   
310    comboSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Calibrant '),0,
311        wx.ALIGN_CENTER_VERTICAL)
312    calSel = wx.ComboBox(parent=self.dataDisplay,value=data['calibrant'],choices=calList,
313        style=wx.CB_READONLY|wx.CB_DROPDOWN|wx.CB_SORT)
314    calSel.Bind(wx.EVT_COMBOBOX, OnNewCalibrant)
315    comboSizer.Add(calSel,0,wx.ALIGN_CENTER_VERTICAL)
316    comboSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Pixel search range '),0,
317        wx.ALIGN_CENTER_VERTICAL)
318    pixLimit = wx.ComboBox(parent=self.dataDisplay,value=str(data['pixLimit']),choices=['1','2','5','10','15','20'],
319        style=wx.CB_READONLY|wx.CB_DROPDOWN)
320    pixLimit.Bind(wx.EVT_COMBOBOX, OnPixLimit)
321    comboSizer.Add(pixLimit,0,wx.ALIGN_CENTER_VERTICAL)
322    comboSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Min ring I/Ib '),0,
323        wx.ALIGN_CENTER_VERTICAL)
324    cutOff = wx.TextCtrl(parent=self.dataDisplay,value=("%.1f" % (data['cutoff'])),
325        style=wx.TE_PROCESS_ENTER)
326    cutOff.Bind(wx.EVT_TEXT_ENTER,OnCutOff)
327    comboSizer.Add(cutOff,0,wx.ALIGN_CENTER_VERTICAL)
328
329    mainSizer.Add(comboSizer,0,wx.ALIGN_CENTER_HORIZONTAL)
330    mainSizer.Add((5,5),0)
331         
332    dataSizer = wx.FlexGridSizer(6,4,5,5)
333    dataSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Calibration coefficients'),0,
334        wx.ALIGN_CENTER_VERTICAL)   
335    dataSizer.Add((5,0),0)
336    dataSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Integration coefficients'),0,
337        wx.ALIGN_CENTER_VERTICAL)   
338    dataSizer.Add((5,0),0)
339   
340    dataSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Beam center X,Y'),0,
341        wx.ALIGN_CENTER_VERTICAL)
342    cent = data['center']
343    centText = wx.TextCtrl(parent=self.dataDisplay,value=("%8.3f,%8.3f" % (cent[0],cent[1])),style=wx.TE_READONLY)
344    centText.SetBackgroundColour(VERY_LIGHT_GREY)
345    dataSizer.Add(centText,0,wx.ALIGN_CENTER_VERTICAL)
346   
347    dataSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Inner/Outer 2-theta'),0,
348        wx.ALIGN_CENTER_VERTICAL)
349       
350    IOtth = data['IOtth']
351    littleSizer = wx.BoxSizer(wx.HORIZONTAL)
352    self.InnerTth = wx.TextCtrl(parent=self.dataDisplay,
353        value=("%8.2f" % (IOtth[0])),style=wx.TE_PROCESS_ENTER)
354    self.InnerTth.Bind(wx.EVT_TEXT_ENTER,OnIOtth)
355    littleSizer.Add(self.InnerTth,0,wx.ALIGN_CENTER_VERTICAL)
356    self.OuterTth = wx.TextCtrl(parent=self.dataDisplay,
357        value=("%8.2f" % (IOtth[1])),style=wx.TE_PROCESS_ENTER)
358    self.OuterTth.Bind(wx.EVT_TEXT_ENTER,OnIOtth)
359    littleSizer.Add(self.OuterTth,0,wx.ALIGN_CENTER_VERTICAL)
360    dataSizer.Add(littleSizer,0,)
361       
362    dataSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Wavelength'),0,
363        wx.ALIGN_CENTER_VERTICAL)
364    waveSel = wx.TextCtrl(parent=self.dataDisplay,value=("%6.5f" % (data['wavelength'])),
365        style=wx.TE_PROCESS_ENTER)
366    waveSel.Bind(wx.EVT_TEXT_ENTER,OnWavelength)
367    dataSizer.Add(waveSel,0,wx.ALIGN_CENTER_VERTICAL)
368         
369    dataSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Start/End azimuth'),0,
370        wx.ALIGN_CENTER_VERTICAL)
371    LRazim = data['LRazimuth']
372    littleSizer = wx.BoxSizer(wx.HORIZONTAL)
373    self.Lazim = wx.TextCtrl(parent=self.dataDisplay,
374        value=("%6d" % (LRazim[0])),style=wx.TE_PROCESS_ENTER)
375    self.Lazim.Bind(wx.EVT_TEXT_ENTER,OnLRazim)
376    littleSizer.Add(self.Lazim,0,wx.ALIGN_CENTER_VERTICAL)
377    self.Razim = wx.TextCtrl(parent=self.dataDisplay,
378        value=("%6d" % (LRazim[1])),style=wx.TE_PROCESS_ENTER)
379    self.Razim.Bind(wx.EVT_TEXT_ENTER,OnLRazim)
380    littleSizer.Add(self.Razim,0,wx.ALIGN_CENTER_VERTICAL)
381    dataSizer.Add(littleSizer,0,)
382       
383    dataSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Distance'),0,
384        wx.ALIGN_CENTER_VERTICAL)
385    distSel = wx.TextCtrl(parent=self.dataDisplay,value=("%8.3f"%(data['distance'])),style=wx.TE_READONLY)
386    distSel.SetBackgroundColour(VERY_LIGHT_GREY)
387    dataSizer.Add(distSel,0,wx.ALIGN_CENTER_VERTICAL)
388
389    dataSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' No. 2-theta/azimuth bins'),0,
390        wx.ALIGN_CENTER_VERTICAL)
391    littleSizer = wx.BoxSizer(wx.HORIZONTAL)
392    outChan = wx.TextCtrl(parent=self.dataDisplay,value=str(data['outChannels']),style=wx.TE_PROCESS_ENTER)
393    outChan.Bind(wx.EVT_TEXT_ENTER,OnNumOutChans)
394    littleSizer.Add(outChan,0,wx.ALIGN_CENTER_VERTICAL)
395    outAzim = wx.TextCtrl(parent=self.dataDisplay,value=str(data['outAzimuths']),style=wx.TE_PROCESS_ENTER)
396    outAzim.Bind(wx.EVT_TEXT_ENTER,OnNumOutAzms)
397    littleSizer.Add(outAzim,0,wx.ALIGN_CENTER_VERTICAL)
398    dataSizer.Add(littleSizer,0,)
399
400    dataSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Tilt angle'),0,
401        wx.ALIGN_CENTER_VERTICAL)
402    tiltSel = wx.TextCtrl(parent=self.dataDisplay,value=("%9.3f"%(data['tilt'])),style=wx.TE_READONLY)
403    tiltSel.SetBackgroundColour(VERY_LIGHT_GREY)
404    dataSizer.Add(tiltSel,0,wx.ALIGN_CENTER_VERTICAL)
405    showLines = wx.CheckBox(parent=self.dataDisplay,label='Show integration limits?')
406    dataSizer.Add(showLines,0)
407    showLines.Bind(wx.EVT_CHECKBOX, OnShowLines)
408    showLines.SetValue(data['showLines'])
409    fullIntegrate = wx.CheckBox(parent=self.dataDisplay,label='Do full integration?')
410    dataSizer.Add(fullIntegrate,0)
411    fullIntegrate.Bind(wx.EVT_CHECKBOX, OnFullIntegrate)
412    fullIntegrate.SetValue(data['fullIntegrate'])
413   
414    dataSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Tilt rotation'),0,
415        wx.ALIGN_CENTER_VERTICAL)
416    rotSel = wx.TextCtrl(parent=self.dataDisplay,value=("%9.3f"%(data['rotation'])),style=wx.TE_READONLY)
417    rotSel.SetBackgroundColour(VERY_LIGHT_GREY)
418    dataSizer.Add(rotSel,0,wx.ALIGN_CENTER_VERTICAL)
419    setDefault = wx.CheckBox(parent=self.dataDisplay,label='Use as default for all images?')
420    dataSizer.Add(setDefault,0)
421    setDefault.Bind(wx.EVT_CHECKBOX, OnSetDefault)
422    setDefault.SetValue(data['setDefault'])
423    setRings = wx.CheckBox(parent=self.dataDisplay,label='Show ring picks?')
424    dataSizer.Add(setRings,0)
425    setRings.Bind(wx.EVT_CHECKBOX, OnSetRings)
426    setRings.SetValue(data['setRings'])
427       
428    mainSizer.Add(dataSizer,0)
429   
430    mainSizer.Layout()   
431    self.dataDisplay.SetSizer(mainSizer)
432    self.dataDisplay.SetSize(mainSizer.Fit(self.dataFrame))
433    self.dataFrame.setSizePosLeft(mainSizer.Fit(self.dataFrame))
434   
435def UpdateMasks(self,data):
436   
437    def OnTextMsg(event):
438        Obj = event.GetEventObject()
439        Obj.SetToolTipString('Drag this mask on 2D Powder Image with mouse to change ')
440       
441    def OnThreshold(event):
442        try:
443            lower = max(int(lowerThreshold.GetValue()),thresh[0][0])
444        except ValueError:
445            lower = thresh[0][0]
446        try:
447            upper = min(int(upperThreshold.GetValue()),thresh[0][1])
448        except ValueError:
449            upper = thresh[0][1]
450        data['Thresholds'][1] = [lower,upper]
451        lowerThreshold.SetValue("%8d" % (lower))
452        upperThreshold.SetValue("%8d" % (upper))
453        G2plt.PlotExposedImage(self)
454       
455    def OnSpotDiameter(event):
456        Obj = event.GetEventObject()
457        try:
458            diameter = min(100.,max(0.1,float(Obj.GetValue())))
459        except ValueError:
460            diameter = 1.0
461        Obj.SetValue("%.2f"%(diameter))
462        data['Points'][spotIds.index(Obj.GetId())][2] = diameter
463        G2plt.PlotExposedImage(self)
464       
465    def OnDeleteSpot(event):
466        Obj = event.GetEventObject()
467        del(data['Points'][delSpotId.index(Obj)])
468        UpdateMasks(self,data)           
469        G2plt.PlotExposedImage(self)
470       
471    def OnRingThickness(event):
472        Obj = event.GetEventObject()
473        try:
474            thick = min(1.0,max(0.001,float(Obj.GetValue())))
475        except ValueError:
476            thick = 0.1
477        Obj.SetValue("%.3f"%(thick))
478        data['Rings'][ringIds.index(Obj.GetId())][1] = thick
479        G2plt.PlotExposedImage(self)
480       
481    def OnDeleteRing(event):
482        Obj = event.GetEventObject()
483        del(data['Rings'][delRingId.index(Obj)])
484        UpdateMasks(self,data)           
485        G2plt.PlotExposedImage(self)
486
487    def OnArcThickness(event):
488        Obj = event.GetEventObject()
489        try:
490            thick = min(20.0,max(0.001,float(Obj.GetValue())))
491        except ValueError:
492            thick = 0.1
493        Obj.SetValue("%.3f"%(thick))
494        data['Arcs'][arcIds.index(Obj.GetId())][2] = thick
495        G2plt.PlotExposedImage(self)
496       
497    def OnDeleteArc(event):
498        Obj = event.GetEventObject()
499        del(data['Arcs'][delArcId.index(Obj)])
500        UpdateMasks(self,data)           
501        G2plt.PlotExposedImage(self)
502
503    def OnDeletePoly(event):
504        Obj = event.GetEventObject()
505        del(data['Polygons'][delPolyId.index(Obj)])
506        UpdateMasks(self,data)           
507        G2plt.PlotExposedImage(self)
508
509    def OnCopyMask(event):
510        TextList = []
511        Names = []
512        if self.PatternTree.GetCount():
513            id, cookie = self.PatternTree.GetFirstChild(self.root)
514            while id:
515                name = self.PatternTree.GetItemText(id)
516                Names.append(name)
517                if 'IMG' in name:
518                    if id == self.Image:
519                        Source = name
520                        mask = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,id, 'Masks'))
521                    else:
522                        TextList.append([False,name,id])
523                id, cookie = self.PatternTree.GetNextChild(self.root, cookie)
524            if not len(TextList):
525                self.ErrorDialog('Nothing to copy mask to','There must be more than one "IMG" pattern')
526                return
527            dlg = self.CopyDialog(self,'Copy mask information','Copy mask from '+Source+' to:',TextList)
528            try:
529                if dlg.ShowModal() == wx.ID_OK:
530                    result = dlg.GetData()
531                    for i,item in enumerate(result):
532                        ifcopy,name,id = item
533                        if ifcopy:                               
534                            self.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(self,id, 'Masks'),mask)
535            finally:
536                dlg.Destroy()
537       
538    if self.dataDisplay:
539        self.dataDisplay.Destroy()
540    self.dataFrame.SetMenuBar(self.dataFrame.MaskMenu)
541    self.dataFrame.Bind(wx.EVT_MENU, OnCopyMask, id=G2gd.wxID_MASKCOPY)
542    if not self.dataFrame.GetStatusBar():
543        Status = self.dataFrame.CreateStatusBar()
544        Status.SetStatusText("To add mask: On 2D Powder Image, key a:arc, r:ring, s:spot, p:polygon")
545    self.dataDisplay = wx.Panel(self.dataFrame)
546    mainSizer = wx.BoxSizer(wx.VERTICAL)
547    mainSizer.Add((5,10),0)
548
549    thresh = data['Thresholds']         #min/max intensity range
550    spots = data['Points']               #x,y,radius in mm
551    rings = data['Rings']               #radius, thickness
552    polygons = data['Polygons']         #3+ x,y pairs
553    arcs = data['Arcs']                 #radius, start/end azimuth, thickness
554   
555    littleSizer = wx.FlexGridSizer(2,3,0,5)
556    littleSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Lower/Upper limits '),0,
557        wx.ALIGN_CENTER_VERTICAL)
558    Text = wx.TextCtrl(self.dataDisplay,value=("%8d" % (thresh[0][0])),style=wx.TE_READONLY)
559    littleSizer.Add(Text,0,wx.ALIGN_CENTER_VERTICAL)
560    Text.SetBackgroundColour(VERY_LIGHT_GREY)
561    Text = wx.TextCtrl(self.dataDisplay,value=("%8d" % (thresh[0][1])),style=wx.TE_READONLY)
562    littleSizer.Add(Text,0,wx.ALIGN_CENTER_VERTICAL)
563    Text.SetBackgroundColour(VERY_LIGHT_GREY)
564    littleSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Lower/Upper thresholds '),
565        0,wx.ALIGN_CENTER_VERTICAL)
566    lowerThreshold = wx.TextCtrl(parent=self.dataDisplay,
567        value=("%8d" % (thresh[1][0])),style=wx.TE_PROCESS_ENTER)
568    lowerThreshold.Bind(wx.EVT_TEXT_ENTER,OnThreshold)
569    littleSizer.Add(lowerThreshold,0,wx.ALIGN_CENTER_VERTICAL)
570    upperThreshold = wx.TextCtrl(parent=self.dataDisplay,
571        value=("%8d" % (thresh[1][1])),style=wx.TE_PROCESS_ENTER)
572    upperThreshold.Bind(wx.EVT_TEXT_ENTER,OnThreshold)
573    littleSizer.Add(upperThreshold,0,wx.ALIGN_CENTER_VERTICAL)
574    mainSizer.Add(littleSizer,0,)
575    spotIds = []
576    delSpotId = []
577    if spots:
578        littleSizer = wx.FlexGridSizer(len(spots)+2,3,0,5)
579        littleSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Spot masks:'),0,
580            wx.ALIGN_CENTER_VERTICAL)
581        littleSizer.Add((5,0),0)
582        littleSizer.Add((5,0),0)
583        littleSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' position, mm'),0,
584            wx.ALIGN_CENTER_VERTICAL)
585        littleSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' diameter, mm'),0,
586            wx.ALIGN_CENTER_VERTICAL)
587        littleSizer.Add((5,0),0)
588        for x,y,d in spots:
589            spotText = wx.TextCtrl(parent=self.dataDisplay,value=("%.2f,%.2f" % (x,y)),
590                style=wx.TE_READONLY)
591            spotText.SetBackgroundColour(VERY_LIGHT_GREY)
592            littleSizer.Add(spotText,0,wx.ALIGN_CENTER_VERTICAL)
593            spotText.Bind(wx.EVT_ENTER_WINDOW,OnTextMsg)
594            spotDiameter = wx.TextCtrl(parent=self.dataDisplay,value=("%.2f" % (d)),
595                style=wx.TE_PROCESS_ENTER)
596            littleSizer.Add(spotDiameter,0,wx.ALIGN_CENTER_VERTICAL)
597            spotDiameter.Bind(wx.EVT_TEXT_ENTER,OnSpotDiameter)
598            spotIds.append(spotDiameter.GetId())
599            spotDelete = wx.CheckBox(parent=self.dataDisplay,label='delete?')
600            spotDelete.Bind(wx.EVT_CHECKBOX,OnDeleteSpot)
601            delSpotId.append(spotDelete)
602            littleSizer.Add(spotDelete,0,wx.ALIGN_CENTER_VERTICAL)
603        mainSizer.Add(littleSizer,0,)
604    ringIds = []
605    delRingId = []
606    if rings:
607        littleSizer = wx.FlexGridSizer(len(rings)+2,3,0,5)
608        littleSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Ring masks:'),0,
609            wx.ALIGN_CENTER_VERTICAL)
610        littleSizer.Add((5,0),0)
611        littleSizer.Add((5,0),0)
612        littleSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' 2-theta,deg'),0,
613            wx.ALIGN_CENTER_VERTICAL)
614        littleSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' thickness, deg'),0,
615            wx.ALIGN_CENTER_VERTICAL)
616        littleSizer.Add((5,0),0)
617        for tth,thick in rings:
618            ringText = wx.TextCtrl(parent=self.dataDisplay,value=("%.3f" % (tth)),
619                style=wx.TE_READONLY)
620            ringText.SetBackgroundColour(VERY_LIGHT_GREY)
621            ringText.Bind(wx.EVT_ENTER_WINDOW,OnTextMsg)
622            littleSizer.Add(ringText,0,wx.ALIGN_CENTER_VERTICAL)
623            ringThick = wx.TextCtrl(parent=self.dataDisplay,value=("%.3f" % (thick)),
624                style=wx.TE_PROCESS_ENTER)
625            littleSizer.Add(ringThick,0,wx.ALIGN_CENTER_VERTICAL)
626            ringThick.Bind(wx.EVT_TEXT_ENTER,OnRingThickness)
627            ringIds.append(ringThick.GetId())
628            ringDelete = wx.CheckBox(parent=self.dataDisplay,label='delete?')
629            ringDelete.Bind(wx.EVT_CHECKBOX,OnDeleteRing)
630            delRingId.append(ringDelete)
631            littleSizer.Add(ringDelete,0,wx.ALIGN_CENTER_VERTICAL)
632        mainSizer.Add(littleSizer,0,)
633    arcIds = []
634    delArcId = []
635    if arcs:
636        littleSizer = wx.FlexGridSizer(len(rings)+2,4,0,5)
637        littleSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Arc masks:'),0,
638            wx.ALIGN_CENTER_VERTICAL)
639        littleSizer.Add((5,0),0)
640        littleSizer.Add((5,0),0)
641        littleSizer.Add((5,0),0)
642        littleSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' 2-theta,deg'),0,
643            wx.ALIGN_CENTER_VERTICAL)
644        littleSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' azimuth, deg'),0,
645            wx.ALIGN_CENTER_VERTICAL)
646        littleSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' thickness, deg'),0,
647            wx.ALIGN_CENTER_VERTICAL)
648        littleSizer.Add((5,0),0)
649        for tth,azimuth,thick in arcs:
650            arcText = wx.TextCtrl(parent=self.dataDisplay,value=("%.3f" % (tth)),
651                style=wx.TE_READONLY)
652            arcText.SetBackgroundColour(VERY_LIGHT_GREY)
653            arcText.Bind(wx.EVT_ENTER_WINDOW,OnTextMsg)
654            littleSizer.Add(arcText,0,wx.ALIGN_CENTER_VERTICAL)
655            azmText = wx.TextCtrl(parent=self.dataDisplay,value=("%d,%d" % (azimuth[0],azimuth[1])),
656                style=wx.TE_READONLY)
657            azmText.SetBackgroundColour(VERY_LIGHT_GREY)
658            azmText.Bind(wx.EVT_ENTER_WINDOW,OnTextMsg)
659            littleSizer.Add(azmText,0,wx.ALIGN_CENTER_VERTICAL)
660            arcThick = wx.TextCtrl(parent=self.dataDisplay,value=("%.3f" % (thick)),
661                style=wx.TE_PROCESS_ENTER)
662            littleSizer.Add(arcThick,0,wx.ALIGN_CENTER_VERTICAL)
663            arcThick.Bind(wx.EVT_TEXT_ENTER,OnArcThickness)
664            arcIds.append(arcThick.GetId())
665            arcDelete = wx.CheckBox(parent=self.dataDisplay,label='delete?')
666            arcDelete.Bind(wx.EVT_CHECKBOX,OnDeleteArc)
667            delArcId.append(arcDelete)
668            littleSizer.Add(arcDelete,0,wx.ALIGN_CENTER_VERTICAL)
669        mainSizer.Add(littleSizer,0,)
670    polyIds = []
671    delPolyId = []
672    if polygons:
673        littleSizer = wx.FlexGridSizer(len(polygons)+2,2,0,5)
674        littleSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Polygon masks:'),0,
675            wx.ALIGN_CENTER_VERTICAL)
676        littleSizer.Add((5,0),0)
677        for polygon in polygons:
678            if polygon:
679                polyList = []
680                for x,y in polygon:
681                    polyList.append("%.2f, %.2f"%(x,y))
682                polyText = wx.ComboBox(self.dataDisplay,value=polyList[0],choices=polyList,style=wx.CB_READONLY)
683                littleSizer.Add(polyText,0,wx.ALIGN_CENTER_VERTICAL)
684                polyDelete = wx.CheckBox(parent=self.dataDisplay,label='delete?')
685                polyDelete.Bind(wx.EVT_CHECKBOX,OnDeletePoly)
686                delPolyId.append(polyDelete)
687                littleSizer.Add(polyDelete,0,wx.ALIGN_CENTER_VERTICAL)
688        mainSizer.Add(littleSizer,0,)
689    mainSizer.Layout()   
690    self.dataDisplay.SetSizer(mainSizer)
691    self.dataDisplay.SetSize(mainSizer.Fit(self.dataFrame))
692    self.dataFrame.setSizePosLeft(mainSizer.Fit(self.dataFrame))   
Note: See TracBrowser for help on using the repository browser.