source: trunk/GSASIIimgGUI.py @ 139

Last change on this file since 139 was 139, checked in by vondreel, 11 years ago

Add "limits" dmin,pixLimit & cutOff

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