コード例 #1
0
class CalibrationPopup(wx.Frame):
    def __init__(self, parent):

        self.frame = wx.Frame.__init__(self,
                                       parent,
                                       title='Calibration',
                                       size=(900, 700))

        self.parent = parent

        self.statusbar = self.CreateStatusBar(2, wx.CAPTION)
        self.default_cal = 0
        self.default_det = 0
        self.img_fname = ''

        try:
            self.raw_img = parent.plt_img  ## raw_img or flp_img or plt_img mkak 2016.10.28
            self.img_fname = 'Image from diFFit2D viewer.'
        except:
            self.raw_img = np.zeros((1024, 1024))

        self.Init()
        self.Show()

        #        wx.Window.GetEffectiveMinSize
        #        wx.GetBestSize(self)

        self.setDefaults()

    def Init(self):

        self.panel = wx.Panel(self)

        self.DirectionsSizer()
        self.MainSizer()
        #        self.OKsizer()

        self.framebox = wx.BoxSizer(wx.VERTICAL)
        self.framebox.Add(self.dirbox, flag=wx.ALL | wx.EXPAND, border=10)
        self.framebox.Add(self.mainbox, flag=wx.ALL | wx.EXPAND, border=10)
        #        self.framebox.Add(self.okbox,   flag=wx.ALL|wx.ALIGN_RIGHT, border=10)

        ###########################
        ## Pack all together in self.panel
        self.panel.SetSizer(self.framebox)

        ###########################
        ## Set default information
        self.stepno = 0
        self.checkRANGE()
        self.showDirection()

    def setDefaults(self):

        ## Sets some typical defaults specific to GSE 13-ID procedure
        self.entr_pix.SetValue('400')  ## binned pixels (2x200um)
        self.entr_EorL.SetValue('19.0')  ## 19.0 keV
        self.entr_dist.SetValue('0.5')  ## 0.5 m
        self.ch_det.SetSelection(self.default_det)  ## Perkin detector
        self.ch_cal.SetSelection(self.default_cal)  ## CeO2
        self.entr_calimg.SetValue(self.img_fname)

        self.entr_cntrx.SetValue(str(int(self.raw_img.shape[0] /
                                         2)))  ## x-position of beam
        self.entr_cntry.SetValue(str(int(self.raw_img.shape[1] /
                                         2)))  ## y-position of beam

        self.onDorPSel()

    def DirectionsSizer(self):

        ###########################
        ## Directions
        dirbx = wx.StaticBox(self.panel, label='DIRECTIONS', size=(100, 50))
        self.dirbox = wx.StaticBoxSizer(dirbx, wx.VERTICAL)

        hbox_direct = wx.BoxSizer(wx.HORIZONTAL)
        self.followdir = wx.StaticText(self.panel, label='')

        #hbox_direct.Add(self.txt_shp, flag=wx.RIGHT, border=8)
        hbox_direct.Add(self.followdir, flag=wx.ALL | wx.EXPAND, border=8)

        self.dirbox.Add(hbox_direct, flag=wx.ALL | wx.EXPAND, border=10)

        hbox_next = wx.BoxSizer(wx.HORIZONTAL)
        self.btn_prev = wx.Button(self.panel, label='PREVIOUS')
        self.btn_next = wx.Button(self.panel, label='NEXT')

        self.btn_prev.Bind(wx.EVT_BUTTON, self.onPREVIOUS)
        self.btn_next.Bind(wx.EVT_BUTTON, self.onNEXT)

        hbox_next.Add(self.btn_prev, flag=wx.ALL, border=8)
        hbox_next.Add((-1, 100))
        hbox_next.Add(self.btn_next, flag=wx.ALIGN_RIGHT | wx.ALL, border=8)

        self.dirbox.Add(hbox_next, flag=wx.ALL | wx.EXPAND, border=10)

    def MainSizer(self):

        self.mainbox = wx.BoxSizer(wx.VERTICAL)

        ###########################
        ## -----> Main Panel
        self.hmain = wx.BoxSizer(wx.HORIZONTAL)

        self.ImageSizer()
        self.ParameterSizer()

        self.hmain.Add(self.imagebox,
                       proportion=1,
                       flag=wx.ALL | wx.EXPAND,
                       border=10)
        self.hmain.Add(self.parbox, flag=wx.ALL, border=10)

        self.mainbox.Add(self.hmain, flag=wx.ALL | wx.EXPAND, border=10)

    def ParameterSizer(self):
        '''
        This is where the parameters will be.
        '''

        #self.parbox = wx.BoxSizer(wx.VERTICAL)
        prbx = wx.StaticBox(self.panel, label='PARAMETERS', size=(50, 100))
        self.parbox = wx.StaticBoxSizer(prbx, wx.VERTICAL)

        ###########################
        ## Establish lists from pyFAI
        clbrnts = []  #['None']
        self.dets = []  #['None']
        for key, value in pyFAI.detectors.ALL_DETECTORS.items():
            self.dets.append(key)
            if key == 'perkin':
                self.default_det = len(self.dets) - 1
        for key, value in pyFAI.calibrant.ALL_CALIBRANTS.items():
            clbrnts.append(key)
            if key == 'CeO2':
                self.default_cal = len(clbrnts) - 1

        #####
        ## Calibration Image selection
        hbox_cal1 = wx.BoxSizer(wx.HORIZONTAL)
        ttl_calimg = wx.StaticText(self.panel, label='Calibration Image:')
        self.entr_calimg = wx.TextCtrl(self.panel, size=(210, -1))
        #         btn_calimg = wx.Button(self.panel, label='Browse...')

        #         btn_calimg.Bind(wx.EVT_BUTTON, self.loadIMAGE)

        hbox_cal1.Add(ttl_calimg, flag=wx.RIGHT, border=8)
        hbox_cal1.Add(self.entr_calimg, flag=wx.RIGHT | wx.EXPAND, border=8)
        #         hbox_cal1.Add(btn_calimg,       flag=wx.RIGHT,  border=8)
        self.parbox.Add(hbox_cal1, flag=wx.BOTTOM | wx.TOP, border=8)

        btn_calimg = wx.Button(self.panel, label='Browse...')
        btn_calimg.Bind(wx.EVT_BUTTON, self.loadIMAGE)
        self.parbox.Add(btn_calimg, flag=wx.BOTTOM | wx.ALIGN_RIGHT, border=8)

        #####
        ## Calibrant selection
        hbox_cal2 = wx.BoxSizer(wx.HORIZONTAL)
        ttl_cal = wx.StaticText(self.panel, label='Calibrant:')
        self.ch_cal = wx.Choice(self.panel, choices=clbrnts)

        self.ch_cal.Bind(wx.EVT_CHOICE, self.onCalSel)

        hbox_cal2.Add(ttl_cal, flag=wx.RIGHT, border=8)
        hbox_cal2.Add(self.ch_cal, flag=wx.RIGHT, border=8)
        self.parbox.Add(hbox_cal2, flag=wx.BOTTOM, border=30)

        #####
        ## Set-up specific parameters
        hbox_cal3 = wx.BoxSizer(wx.HORIZONTAL)
        txt_exp = wx.StaticText(self.panel, label='SET-UP PARAMETERS')
        btn_pni = wx.Button(self.panel, label='Load file')

        btn_pni.Bind(wx.EVT_BUTTON, self.openPONI)

        hbox_cal3.Add(txt_exp, flag=wx.RIGHT, border=8)
        hbox_cal3.Add(btn_pni, flag=wx.LEFT, border=60)
        self.parbox.Add(hbox_cal3, flag=wx.BOTTOM, border=8)

        #####
        ## Detector selection
        hbox_cal4 = wx.BoxSizer(wx.HORIZONTAL)
        self.ch_DorP = wx.Choice(self.panel,
                                 choices=['Detector name', 'Pixel size (um)'])
        self.ch_det = wx.Choice(self.panel, choices=self.dets)
        self.entr_pix = wx.TextCtrl(self.panel, size=(110, -1))

        self.ch_det.Bind(wx.EVT_CHOICE, self.onDetSel)
        self.ch_DorP.Bind(wx.EVT_CHOICE, self.onDorPSel)

        hbox_cal4.Add(self.ch_DorP, flag=wx.RIGHT, border=8)
        hbox_cal4.Add(self.ch_det, flag=wx.RIGHT, border=8)
        hbox_cal4.Add(self.entr_pix, flag=wx.RIGHT, border=8)
        self.parbox.Add(hbox_cal4, flag=wx.BOTTOM, border=8)

        #####
        ## Energy or Wavelength
        hbox_cal5 = wx.BoxSizer(wx.HORIZONTAL)
        self.ch_EorL = wx.Choice(self.panel,
                                 choices=['Energy (keV)', 'Wavelength (A)'])
        self.entr_EorL = wx.TextCtrl(self.panel, size=(110, -1))

        self.ch_EorL.Bind(wx.EVT_CHOICE, self.onEorLSel)

        hbox_cal5.Add(self.ch_EorL, flag=wx.RIGHT, border=8)
        hbox_cal5.Add(self.entr_EorL, flag=wx.RIGHT, border=8)
        self.parbox.Add(hbox_cal5, flag=wx.BOTTOM, border=8)

        ## Distance
        hbox_cal6 = wx.BoxSizer(wx.HORIZONTAL)
        ttl_dist = wx.StaticText(self.panel, label='Detector distance (m):')
        self.entr_dist = wx.TextCtrl(self.panel, size=(110, -1))

        hbox_cal6.Add(ttl_dist, flag=wx.RIGHT, border=8)
        hbox_cal6.Add(self.entr_dist, flag=wx.RIGHT, border=8)

        self.parbox.Add(hbox_cal6, flag=wx.BOTTOM, border=8)

        ## Beam center x
        hbox_cal7 = wx.BoxSizer(wx.HORIZONTAL)
        ttl_cntrx = wx.StaticText(self.panel, label='Beam center, x (pixels):')
        self.entr_cntrx = wx.TextCtrl(self.panel, size=(110, -1))

        hbox_cal7.Add(ttl_cntrx, flag=wx.RIGHT, border=8)
        hbox_cal7.Add(self.entr_cntrx, flag=wx.RIGHT, border=8)

        self.parbox.Add(hbox_cal7, flag=wx.BOTTOM, border=8)

        ## Beam center y
        hbox_cal8 = wx.BoxSizer(wx.HORIZONTAL)
        ttl_cntry = wx.StaticText(self.panel, label='Beam center, y (pixels):')
        self.entr_cntry = wx.TextCtrl(self.panel, size=(110, -1))

        hbox_cal8.Add(ttl_cntry, flag=wx.RIGHT, border=8)
        hbox_cal8.Add(self.entr_cntry, flag=wx.RIGHT, border=8)

        self.parbox.Add(hbox_cal8, flag=wx.BOTTOM, border=8)

    def onCalSel(self, event=None):
        print('Selected calibrant: %s' %
              self.ch_cal.GetString(self.ch_cal.GetSelection()))

    def onDetSel(self, event=None):
        print('Selected detector: %s' %
              self.ch_det.GetString(self.ch_det.GetSelection()))

    def onEorLSel(self, event=None):

        if self.ch_EorL.GetSelection() == 1:
            energy = float(self.entr_EorL.GetValue())  ## units keV
            wavelength = lambda_from_E(energy)  ## units: A
            self.entr_EorL.SetValue(str(wavelength))
        else:
            wavelength = float(self.entr_EorL.GetValue()) * 1e-10  ## units: m
            energy = E_from_lambda(wavelength)  ## units: keV
            self.entr_EorL.SetValue(str(energy))

    def onDorPSel(self, event=None):
        if self.ch_DorP.GetSelection() == 0:
            self.entr_pix.Hide()
            self.ch_det.Show()
        else:
            self.ch_det.Hide()
            self.entr_pix.Show()

        self.panel.GetSizer().Layout()
        self.panel.GetParent().Layout()

    def loadIMAGE(self, event=None):
        wildcards = 'XRD image (*.edf,*.tif,*.tiff)|*.tif;*.tiff;*.edf|All files (*.*)|*.*'
        if os.path.exists(self.entr_calimg.GetValue()):
            dfltDIR = self.entr_calimg.GetValue()
        else:
            dfltDIR = os.getcwd()

        dlg = wx.FileDialog(self,
                            message='Choose XRD calibration file',
                            defaultDir=dfltDIR,
                            wildcard=wildcards,
                            style=wx.FD_OPEN)

        path, read = None, False
        if dlg.ShowModal() == wx.ID_OK:
            read = True
            path = dlg.GetPath().replace('\\', '/')
        dlg.Destroy()

        if read:
            try:
                #                 self.raw_img = plt.imread(path)
                self.raw_img = tifffile.imread(path)
                #self.raw_img = fabio.open(path).data
            except:
                print('Image not properly opened.')
                pass
            self.plot2Dimg.display(self.raw_img)
            self.plot2Dimg.redraw()
            self.AutoContrast()

            self.entr_calimg.Clear()
            self.entr_calimg.SetValue(path)  #os.path.split(path)[-1]

    def ImageSizer(self):
        '''
        Image Panel
        '''
        self.imagebox = wx.BoxSizer(wx.VERTICAL)

        self.plot2Dimage()

        self.btn_image = wx.Button(self.panel, label='IMAGE TOOLS')

        self.btn_image.Bind(wx.EVT_BUTTON, self.onImageTools)

        self.imagebox.Add(self.plot2Dimg,
                          proportion=1,
                          flag=wx.ALL | wx.EXPAND,
                          border=10)
        self.imagebox.Add(self.btn_image, flag=wx.ALL, border=10)


#     def OKsizer(self):
#         ###########################
#         ## OK - CANCEL
#         self.okbox = wx.BoxSizer(wx.HORIZONTAL)
#
#         okBtn  = wx.Button(self.panel, wx.ID_OK     )
#         canBtn = wx.Button(self.panel, wx.ID_CANCEL )
#
#         self.okbox.Add(canBtn,  flag=wx.RIGHT, border=5)
#         self.okbox.Add(okBtn,   flag=wx.RIGHT, border=5)

    def write_message(self, s, panel=0):
        """write a message to the Status Bar"""
        self.SetStatusText(s, panel)

    def onImageTools(self, event=None):

        self.toolbox = ImageToolboxFrame(self.plot2Dimg, self.raw_img)

    def plot2Dimage(self):

        self.plot2Dimg = ImagePanel(self.panel, size=(300, 300))
        self.plot2Dimg.messenger = self.write_message

        self.plot2Dimg.display(self.raw_img)
        self.AutoContrast()

        self.plot2Dimg.redraw()

    def AutoContrast(self):

        self.minINT = int(np.min(self.raw_img))
        self.maxINT = int(np.max(self.raw_img) /
                          15)  # /15 scales image to viewable
        if self.maxINT == self.minINT:
            self.minINT = self.minINT - 50
            self.maxINT = self.minINT + 100

        self.minCURRENT = self.minINT
        self.maxCURRENT = self.maxINT
        if self.maxCURRENT > self.maxINT:
            self.maxCURRENT = self.maxINT

        self.plot2Dimg.conf.auto_intensity = False
        self.plot2Dimg.conf.int_lo[0] = self.minCURRENT
        self.plot2Dimg.conf.int_hi[0] = self.maxCURRENT
        #         self.plot2Dimg.conf.int_lo['int'] = self.minCURRENT
        #         self.plot2Dimg.conf.int_hi['int'] = self.maxCURRENT

        ## vertical flip default
        self.plot2Dimg.conf.flip_ud = True
        self.plot2Dimg.conf.flip_lr = False

        self.plot2Dimg.redraw()

    def checkRANGE(self):

        if self.stepno <= 0:
            self.stepno = 0
            self.btn_prev.Disable()
        else:
            self.btn_prev.Enable()

        if self.stepno >= 8:
            self.stepno = 8
            self.btn_next.Disable()
        else:
            self.btn_next.Enable()

    def onNEXT(self, event=None):
        self.stepno = self.stepno + 1
        self.checkRANGE()
        self.showDirection()

    def onPREVIOUS(self, event=None):
        self.stepno = self.stepno - 1
        self.checkRANGE()
        self.showDirection()

    def showDirection(self):

        dirsteps = [
            'Enter parameters into the fields below.',
            'Select point(s) on the first ring.',
            'Select point(s) on the second ring.',
            'Select point(s) on the third ring.',
            'Select point(s) on the fourth ring.',
            'Select point(s) on the fifth ring.',
            'Select point(s) on the sixth ring.',
            'Check preliminary calibration. Continue for final refinement.',
            'Refinement complete.'
        ]

        self.followdir.SetLabel(dirsteps[self.stepno])

    def openPONI(self, event=None):

        wildcards = 'pyFAI calibration file (*.poni)|*.poni|All files (*.*)|*.*'
        dlg = wx.FileDialog(self,
                            message='Choose pyFAI calibration file',
                            defaultDir=os.getcwd(),
                            wildcard=wildcards,
                            style=wx.FD_OPEN)

        path, read = None, False
        if dlg.ShowModal() == wx.ID_OK:
            read = True
            path = dlg.GetPath().replace('\\', '/')
        dlg.Destroy()

        if read:

            try:
                print
                self.ai = pyFAI.load(path)
                print('Loading calibration file: %s' % path)
            except:
                print('Not recognized as a pyFAI calibration file: %s' % path)
                return

            ## Sets viewer to values in .poni file
            self.entr_dist.SetValue('%0.4f' % self.ai._dist)
            self.entr_pix.SetValue('%0.1f' %
                                   float(self.ai.detector.pixel1 * 1000000.))
            self.ch_DorP.SetSelection(1)
            self.entr_EorL.SetValue('%0.4f' %
                                    float(self.ai._wavelength * 1.e10))
            self.ch_EorL.SetSelection(1)
            self.onDorPSel()

            cenx = float(self.ai._poni1) / float(self.ai.detector.pixel1)
            ceny = float(self.ai._poni2) / float(self.ai.detector.pixel2)
            self.entr_cntrx.SetValue('%0.3f' % cenx)
            self.entr_cntry.SetValue('%0.3f' % ceny)
コード例 #2
0
class CalibrationPopup(wx.Frame):

    def __init__(self,parent):
    
        self.frame = wx.Frame.__init__(self, parent, title='Calibration',size=(900,700))
        
        self.parent = parent
                
        self.statusbar = self.CreateStatusBar(2,wx.CAPTION )
        self.default_cal = 0
        self.default_det = 0
        self.img_fname = ''

        try:
            self.raw_img = parent.plt_img ## raw_img or flp_img or plt_img mkak 2016.10.28
            self.img_fname = 'Image from diFFit2D viewer.'
        except:
            self.raw_img = np.zeros((1024,1024))
        
        self.Init()
        self.Show()
        
#        wx.Window.GetEffectiveMinSize
#        wx.GetBestSize(self)

        self.setDefaults()
        
        
        
    def Init(self):    

        self.panel = wx.Panel(self)

        self.DirectionsSizer()
        self.MainSizer()
#        self.OKsizer()

        self.framebox = wx.BoxSizer(wx.VERTICAL)
        self.framebox.Add(self.dirbox,  flag=wx.ALL|wx.EXPAND, border=10)
        self.framebox.Add(self.mainbox, flag=wx.ALL|wx.EXPAND, border=10)
#        self.framebox.Add(self.okbox,   flag=wx.ALL|wx.ALIGN_RIGHT, border=10)
        
        ###########################
        ## Pack all together in self.panel
        self.panel.SetSizer(self.framebox) 

        ###########################
        ## Set default information
        self.stepno = 0
        self.checkRANGE()
        self.showDirection()

    def setDefaults(self):
    
        ## Sets some typical defaults specific to GSE 13-ID procedure
        self.entr_pix.SetValue('400')     ## binned pixels (2x200um)
        self.entr_EorL.SetValue('19.0')     ## 19.0 keV
        self.entr_dist.SetValue('0.5')  ## 0.5 m
        self.ch_det.SetSelection(self.default_det)  ## Perkin detector
        self.ch_cal.SetSelection(self.default_cal)  ## CeO2
        self.entr_calimg.SetValue(self.img_fname)
        
        self.entr_cntrx.SetValue(str(int(self.raw_img.shape[0]/2))) ## x-position of beam
        self.entr_cntry.SetValue(str(int(self.raw_img.shape[1]/2))) ## y-position of beam
        
        self.onDorPSel(None)

    def DirectionsSizer(self):

        ###########################
        ## Directions
        dirbx = wx.StaticBox(self.panel,label='DIRECTIONS', size=(100, 50))
        self.dirbox = wx.StaticBoxSizer(dirbx,wx.VERTICAL)
        
        hbox_direct = wx.BoxSizer(wx.HORIZONTAL)
        self.followdir = wx.StaticText(self.panel,label='')

        #hbox_direct.Add(self.txt_shp, flag=wx.RIGHT, border=8)
        hbox_direct.Add(self.followdir, flag=wx.ALL|wx.EXPAND, border=8)
       
        self.dirbox.Add(hbox_direct, flag=wx.ALL|wx.EXPAND, border=10)
    
        hbox_next = wx.BoxSizer(wx.HORIZONTAL)
        self.btn_prev = wx.Button(self.panel,label='PREVIOUS')
        self.btn_next = wx.Button(self.panel,label='NEXT')

        self.btn_prev.Bind(wx.EVT_BUTTON,self.onPREVIOUS)
        self.btn_next.Bind(wx.EVT_BUTTON,self.onNEXT)

        hbox_next.Add(self.btn_prev, flag=wx.ALL, border=8)
        hbox_next.Add((-1, 100))
        hbox_next.Add(self.btn_next, flag=wx.ALIGN_RIGHT|wx.ALL, border=8)
       
        self.dirbox.Add(hbox_next, flag=wx.ALL|wx.EXPAND, border=10)

    def MainSizer(self):
    
        self.mainbox = wx.BoxSizer(wx.VERTICAL)

        ###########################
        ## -----> Main Panel
        self.hmain = wx.BoxSizer(wx.HORIZONTAL)
        
        self.ImageSizer()
        self.ParameterSizer()

        self.hmain.Add(self.imagebox,proportion=1,flag=wx.ALL|wx.EXPAND, border=10)
        self.hmain.Add(self.parbox, flag=wx.ALL, border=10)
        
        self.mainbox.Add(self.hmain, flag=wx.ALL|wx.EXPAND, border=10)

    def ParameterSizer(self):
        '''
        This is where the parameters will be.
        '''
        
        #self.parbox = wx.BoxSizer(wx.VERTICAL)
        prbx = wx.StaticBox(self.panel,label='PARAMETERS', size=(50, 100))
        self.parbox = wx.StaticBoxSizer(prbx,wx.VERTICAL)
        
        ###########################
        ## Establish lists from pyFAI        
        clbrnts = [] #['None']
        self.dets = [] #['None']
        for key,value in pyFAI.detectors.ALL_DETECTORS.items():
            self.dets.append(key)
            if key == 'perkin':
                self.default_det = len(self.dets)-1
        for key,value in pyFAI.calibrant.ALL_CALIBRANTS.items():
            clbrnts.append(key)    
            if key == 'CeO2':
                self.default_cal = len(clbrnts)-1
       

        #####
        ## Calibration Image selection        
        hbox_cal1  = wx.BoxSizer(wx.HORIZONTAL)
        ttl_calimg = wx.StaticText(self.panel, label='Calibration Image:' )
        self.entr_calimg = wx.TextCtrl(self.panel, size=(210, -1))
#         btn_calimg = wx.Button(self.panel, label='Browse...')
        
#         btn_calimg.Bind(wx.EVT_BUTTON, self.loadIMAGE)
        
        hbox_cal1.Add(ttl_calimg,       flag=wx.RIGHT,  border=8)
        hbox_cal1.Add(self.entr_calimg, flag=wx.RIGHT|wx.EXPAND,  border=8)
#         hbox_cal1.Add(btn_calimg,       flag=wx.RIGHT,  border=8)
        self.parbox.Add(hbox_cal1,      flag=wx.BOTTOM|wx.TOP, border=8)

        btn_calimg = wx.Button(self.panel, label='Browse...')
        btn_calimg.Bind(wx.EVT_BUTTON, self.loadIMAGE)
        self.parbox.Add(btn_calimg,      flag=wx.BOTTOM|wx.ALIGN_RIGHT, border=8)
                
        #####
        ## Calibrant selection
        hbox_cal2 = wx.BoxSizer(wx.HORIZONTAL)
        ttl_cal = wx.StaticText(self.panel, label='Calibrant:') 
        self.ch_cal = wx.Choice(self.panel,choices=clbrnts)

        self.ch_cal.Bind(wx.EVT_CHOICE,  self.onCalSel)

        hbox_cal2.Add(ttl_cal,     flag=wx.RIGHT,  border=8)
        hbox_cal2.Add(self.ch_cal, flag=wx.RIGHT,  border=8)
        self.parbox.Add(hbox_cal2, flag=wx.BOTTOM, border=30)        

        #####
        ## Set-up specific parameters
        hbox_cal3 = wx.BoxSizer(wx.HORIZONTAL)
        txt_exp = wx.StaticText(self.panel, label='SET-UP PARAMETERS')
        btn_pni = wx.Button(self.panel, label='Load file')

        btn_pni.Bind(wx.EVT_BUTTON,  self.openPONI)

        hbox_cal3.Add(txt_exp,     flag=wx.RIGHT,  border=8)
        hbox_cal3.Add(btn_pni,     flag=wx.LEFT,  border=60)
        self.parbox.Add(hbox_cal3, flag=wx.BOTTOM, border=8)

        #####
        ## Detector selection
        hbox_cal4 = wx.BoxSizer(wx.HORIZONTAL)
        self.ch_DorP = wx.Choice(self.panel,choices=['Detector name','Pixel size (um)'])
        self.ch_det  = wx.Choice(self.panel, choices=self.dets)
        self.entr_pix    = wx.TextCtrl(self.panel, size=(110, -1))

        self.ch_det.Bind(wx.EVT_CHOICE,  self.onDetSel)
        self.ch_DorP.Bind(wx.EVT_CHOICE, self.onDorPSel)

        hbox_cal4.Add(self.ch_DorP,  flag=wx.RIGHT,  border=8)
        hbox_cal4.Add(self.ch_det,   flag=wx.RIGHT,  border=8)
        hbox_cal4.Add(self.entr_pix, flag=wx.RIGHT,  border=8)        
        self.parbox.Add(hbox_cal4,   flag=wx.BOTTOM, border=8)

        #####
        ## Energy or Wavelength
        hbox_cal5 = wx.BoxSizer(wx.HORIZONTAL)
        self.ch_EorL = wx.Choice(self.panel,choices=['Energy (keV)','Wavelength (A)'])
        self.entr_EorL = wx.TextCtrl(self.panel, size=(110, -1))
 
        self.ch_EorL.Bind(wx.EVT_CHOICE, self.onEorLSel)
 
        hbox_cal5.Add(self.ch_EorL,   flag=wx.RIGHT,  border=8)
        hbox_cal5.Add(self.entr_EorL, flag=wx.RIGHT,  border=8)
        self.parbox.Add(hbox_cal5,    flag=wx.BOTTOM, border=8) 

        ## Distance
        hbox_cal6 = wx.BoxSizer(wx.HORIZONTAL)
        ttl_dist = wx.StaticText(self.panel, label='Detector distance (m):')
        self.entr_dist = wx.TextCtrl(self.panel, size=(110, -1))
        
        hbox_cal6.Add(ttl_dist,       flag=wx.RIGHT,  border=8)        
        hbox_cal6.Add(self.entr_dist, flag=wx.RIGHT,  border=8)
        
        self.parbox.Add(hbox_cal6,   flag=wx.BOTTOM, border=8) 

        ## Beam center x
        hbox_cal7 = wx.BoxSizer(wx.HORIZONTAL)
        ttl_cntrx = wx.StaticText(self.panel, label='Beam center, x (pixels):')
        self.entr_cntrx = wx.TextCtrl(self.panel, size=(110, -1))
        
        hbox_cal7.Add(ttl_cntrx,       flag=wx.RIGHT,  border=8)        
        hbox_cal7.Add(self.entr_cntrx, flag=wx.RIGHT,  border=8)
        
        self.parbox.Add(hbox_cal7,   flag=wx.BOTTOM, border=8) 

        ## Beam center y
        hbox_cal8 = wx.BoxSizer(wx.HORIZONTAL)
        ttl_cntry = wx.StaticText(self.panel, label='Beam center, y (pixels):')
        self.entr_cntry = wx.TextCtrl(self.panel, size=(110, -1))
        
        hbox_cal8.Add(ttl_cntry,       flag=wx.RIGHT,  border=8)        
        hbox_cal8.Add(self.entr_cntry, flag=wx.RIGHT,  border=8)
        
        self.parbox.Add(hbox_cal8,   flag=wx.BOTTOM, border=8) 


    def onCalSel(self,event):
        print('Selected calibrant: %s' % self.ch_cal.GetString(self.ch_cal.GetSelection()))

    def onDetSel(self,event):
        print('Selected detector: %s' % self.ch_det.GetString(self.ch_det.GetSelection()))


    def onEorLSel(self,event): 
        hc = constants.value(u'Planck constant in eV s') * \
                       constants.value(u'speed of light in vacuum') * 1e-3 ## units: keV-m
        if self.ch_EorL.GetSelection() == 1:
            energy = float(self.entr_EorL.GetValue()) ## units keV
            wavelength = hc/(energy)*1e10 ## units: A
            self.entr_EorL.SetValue(str(wavelength))
        else:
            wavelength = float(self.entr_EorL.GetValue())*1e-10 ## units: m
            energy = hc/(wavelength) ## units: keV
            self.entr_EorL.SetValue(str(energy))

    def onDorPSel(self,event): 
        if self.ch_DorP.GetSelection() == 0:
            self.entr_pix.Hide()
            self.ch_det.Show()
        else:
            self.ch_det.Hide()
            self.entr_pix.Show()

        self.panel.GetSizer().Layout() 
        self.panel.GetParent().Layout()

    def loadIMAGE(self, event): 
        wildcards = 'XRD image (*.edf,*.tif,*.tiff)|*.tif;*.tiff;*.edf|All files (*.*)|*.*'
        dlg = wx.FileDialog(self, message='Choose XRD calibration file',
                           defaultDir=os.getcwd(),
                           wildcard=wildcards, style=wx.FD_OPEN)

        path, read = None, False
        if dlg.ShowModal() == wx.ID_OK:
            read = True
            path = dlg.GetPath().replace('\\', '/')
        dlg.Destroy()
        
        if read:
            try:
                self.raw_img = fabio.open(path).data
            except:
                print('This is not an image openable by fabio.')
                pass
            self.plot2Dimg.display(self.raw_img)       
            self.plot2Dimg.redraw()
            self.AutoContrast()

            self.entr_calimg.Clear()
            self.entr_calimg.SetValue(path) #os.path.split(path)[-1]
 

    def ImageSizer(self):
        '''
        Image Panel
        '''
        self.imagebox = wx.BoxSizer(wx.VERTICAL)
        
        self.plot2Dimage()
        
        self.btn_image = wx.Button(self.panel,label='IMAGE TOOLS')

        self.btn_image.Bind(wx.EVT_BUTTON,self.onImageTools)

        self.imagebox.Add(self.plot2Dimg,proportion=1,flag=wx.ALL|wx.EXPAND, border=10)
        self.imagebox.Add(self.btn_image, flag=wx.ALL, border=10) 

#     def OKsizer(self):
#         ###########################
#         ## OK - CANCEL
#         self.okbox = wx.BoxSizer(wx.HORIZONTAL)
#         
#         okBtn  = wx.Button(self.panel, wx.ID_OK     )
#         canBtn = wx.Button(self.panel, wx.ID_CANCEL )
# 
#         self.okbox.Add(canBtn,  flag=wx.RIGHT, border=5)
#         self.okbox.Add(okBtn,   flag=wx.RIGHT, border=5)
     
    def write_message(self, s, panel=0):
        """write a message to the Status Bar"""
        self.SetStatusText(s, panel)

    def onImageTools(self,event):
        
        self.toolbox = ImageToolboxFrame(self.plot2Dimg,self.raw_img)

    def plot2Dimage(self):
    
        self.plot2Dimg = ImagePanel(self.panel,size=(300, 300))
        self.plot2Dimg.messenger = self.write_message

        self.plot2Dimg.display(self.raw_img) 
        self.AutoContrast()      

        self.plot2Dimg.redraw()

    def AutoContrast(self):
    
        self.minINT = int(np.min(self.raw_img))
        self.maxINT = int(np.max(self.raw_img)/15) # /15 scales image to viewable 
        if self.maxINT == self.minINT:
            self.minINT = self.minINT-50
            self.maxINT = self.minINT+100

        self.minCURRENT = self.minINT
        self.maxCURRENT = self.maxINT
        if self.maxCURRENT > self.maxINT:
            self.maxCURRENT = self.maxINT
        
        self.plot2Dimg.conf.auto_intensity = False        
        self.plot2Dimg.conf.int_lo[0] = self.minCURRENT
        self.plot2Dimg.conf.int_hi[0] = self.maxCURRENT
#         self.plot2Dimg.conf.int_lo['int'] = self.minCURRENT
#         self.plot2Dimg.conf.int_hi['int'] = self.maxCURRENT
        
        ## vertical flip default
        self.plot2Dimg.conf.flip_ud = True
        self.plot2Dimg.conf.flip_lr = False 
       
        self.plot2Dimg.redraw()   
        
    def checkRANGE(self):
    
        if self.stepno <= 0:
            self.stepno = 0
            self.btn_prev.Disable()
        else:
            self.btn_prev.Enable()

        if self.stepno >= 8:
            self.stepno = 8
            self.btn_next.Disable()
        else:
            self.btn_next.Enable()

    def onNEXT(self, event):
        self.stepno = self.stepno + 1
        self.checkRANGE()
        self.showDirection()
    
    def onPREVIOUS(self,event):
        self.stepno = self.stepno - 1
        self.checkRANGE()
        self.showDirection()
    
    def showDirection(self):
        
        dirsteps = ['Enter parameters into the fields below.',
                    'Select point(s) on the first ring.',
                    'Select point(s) on the second ring.',
                    'Select point(s) on the third ring.',
                    'Select point(s) on the fourth ring.',
                    'Select point(s) on the fifth ring.',
                    'Select point(s) on the sixth ring.',
                    'Check preliminary calibration. Continue for final refinement.',
                    'Refinement complete.' ]
                    
        self.followdir.SetLabel(dirsteps[self.stepno])

    def openPONI(self,event):
             
        wildcards = 'pyFAI calibration file (*.poni)|*.poni|All files (*.*)|*.*'
        dlg = wx.FileDialog(self, message='Choose pyFAI calibration file',
                           defaultDir=os.getcwd(),
                           wildcard=wildcards, style=wx.FD_OPEN)

        path, read = None, False
        if dlg.ShowModal() == wx.ID_OK:
            read = True
            path = dlg.GetPath().replace('\\', '/')
        dlg.Destroy()
        
        if read:

            try:
                print
                self.ai = pyFAI.load(path)
                print('Loading calibration file: %s' % path)
            except:
                print('Not recognized as a pyFAI calibration file: %s' % path)
                return

            ## Sets viewer to values in .poni file
            self.entr_dist.SetValue('%0.4f' % self.ai._dist)
            self.entr_pix.SetValue('%0.1f' % float(self.ai.detector.pixel1*1000000.))
            self.ch_DorP.SetSelection(1)
            self.entr_EorL.SetValue('%0.4f' % float(self.ai._wavelength*1.e10))
            self.ch_EorL.SetSelection(1)
            self.onDorPSel(None)
            
            cenx = float(self.ai._poni1)/float(self.ai.detector.pixel1)
            ceny = float(self.ai._poni2)/float(self.ai.detector.pixel2)
            self.entr_cntrx.SetValue('%0.3f' % cenx)
            self.entr_cntry.SetValue('%0.3f' % ceny)
コード例 #3
0
ファイル: XRDMaskFrame.py プロジェクト: maurov/xraylarch
class MaskToolsPopup(wx.Frame):

    def __init__(self,parent):
    
        self.frame = wx.Frame.__init__(self, parent, title='Create mask',size=(800,600))

        self.parent = parent
        self.statusbar = self.CreateStatusBar(2,wx.CAPTION )

        try:
            self.raw_img = parent.plt_img ## raw_img or flp_img or plt_img mkak 2016.10.28
        except:
            self.loadIMAGE()


        self.setDefaults()        
        
        
        self.Init()
        self.Show()
        
#        wx.Window.GetEffectiveMinSize
#        wx.GetBestSize(self)

        
    def Init(self):    

        self.panel = wx.Panel(self)

        self.MainSizer()

        self.framebox = wx.BoxSizer(wx.VERTICAL)
        self.framebox.Add(self.mainbox, flag=wx.ALL|wx.EXPAND, border=10)
        
        ###########################
        ## Pack all together in self.panel
        self.panel.SetSizer(self.framebox) 


    def setDefaults(self):
    
        self.area_list = []
        
    def MainSizer(self):
    
        self.mainbox = wx.BoxSizer(wx.VERTICAL)

        ###########################
        ## -----> Main Panel
        self.hmain = wx.BoxSizer(wx.HORIZONTAL)
        
        self.ImageSizer()
        self.DrawNewSizer()

        self.hmain.Add(self.imagebox,proportion=1,flag=wx.ALL|wx.EXPAND, border=10)
        self.hmain.Add(self.toolbox, flag=wx.ALL, border=10)
        
        self.mainbox.Add(self.hmain, flag=wx.ALL|wx.EXPAND, border=10)


    def DrawNewSizer(self):
    
        self.toolbox = wx.BoxSizer(wx.VERTICAL)
        
        ###########################
        ## Directions
        nwbx = wx.StaticBox(self.panel,label='Drawing Tools', size=(100, 50))
        drawbox = wx.StaticBoxSizer(nwbx,wx.VERTICAL)

        ###########################
        ## Drawing tools
        hbox_shp = wx.BoxSizer(wx.HORIZONTAL)
        self.txt_shp = wx.StaticText(self.panel, label='DRAWING SHAPE')
        shapes = ['circle','pixel','polygon','square']

        self.ch_shp = wx.Choice(self.panel,choices=shapes)

        self.ch_shp.Bind(wx.EVT_CHOICE,self.ShapeChoice)
    
        hbox_shp.Add(self.txt_shp, flag=wx.RIGHT, border=8)
        hbox_shp.Add(self.ch_shp, flag=wx.EXPAND, border=8)

        drawbox.Add(hbox_shp, flag=wx.ALL|wx.EXPAND, border=10)

        ###########################
        ## Drawn Areas
        vbox_areas = wx.BoxSizer(wx.VERTICAL)
        hbox_areas = wx.BoxSizer(wx.HORIZONTAL)
        
        self.slct_area = wx.ListBox(self.panel, 26, wx.DefaultPosition, (170, 130), self.area_list, wx.LB_SINGLE)
        
        self.btn_SHWarea = wx.Button(self.panel,label='SHOW')                
        self.btn_DELarea = wx.Button(self.panel,label='DELETE')

        self.btn_SHWarea.Bind(wx.EVT_BUTTON,self.showAREA)
        self.btn_DELarea.Bind(wx.EVT_BUTTON,self.deleteAREA)
        
        hbox_areas.Add(self.btn_SHWarea, flag=wx.BOTTOM, border=10)
        hbox_areas.Add(self.btn_DELarea, flag=wx.BOTTOM, border=10)

        self.btn_clear = wx.Button(self.panel,label='CLEAR ALL')
       
        self.btn_clear.Bind(wx.EVT_BUTTON,self.clearMask)
        
        vbox_areas.Add(self.slct_area, flag=wx.ALL|wx.EXPAND, border=10)        
        vbox_areas.Add(hbox_areas, flag=wx.ALL|wx.EXPAND, border=10)        
        vbox_areas.Add(self.btn_clear, flag=wx.ALL|wx.EXPAND, border=10)        
        drawbox.Add(vbox_areas, flag=wx.ALL|wx.EXPAND, border=10)
    
        self.toolbox.Add(drawbox, flag=wx.ALL, border=10)
    
        self.btn_save = wx.Button(self.panel,label='SAVE MASK')
        self.btn_save.Bind(wx.EVT_BUTTON,self.saveMask)
        self.toolbox.Add(self.btn_save, flag=wx.ALL, border=10)
        
        self.btn_SHWarea.Disable()
        self.btn_DELarea.Disable()
        self.btn_clear.Disable()
        self.btn_save.Disable()

    def startIMAGE(self):
    
        self.loadIMAGE() 

    def loadIMAGE(self,event=None): 
        wildcards = 'XRD image (*.edf,*.tif,*.tiff)|*.tif;*.tiff;*.edf|All files (*.*)|*.*'
        dlg = wx.FileDialog(self, message='Choose XRD image',
                           defaultDir=os.getcwd(),
                           wildcard=wildcards, style=wx.FD_OPEN)

        path, read = None, False
        if dlg.ShowModal() == wx.ID_OK:
            read = True
            path = dlg.GetPath().replace('\\', '/')
        dlg.Destroy()
        
        if read:
            try:
#                 self.raw_img = plt.imread(path)
                self.raw_img = tifffile.imread(path)
                #self.raw_img = fabio.open(path).data
            except:
                print('Image not properly opened.')
                self.raw_img = np.zeros((1024,1024))
        else:
            print('No image selected.')
            self.raw_img = np.zeros((1024,1024))            

    def ImageSizer(self):
        '''
        Image Panel
        '''
        self.imagebox = wx.BoxSizer(wx.VERTICAL)
        
        self.plot2Dimage()
        
        imagetools = wx.BoxSizer(wx.HORIZONTAL)
        
        self.btn_image = wx.Button(self.panel,label='IMAGE TOOLS')
        self.btn_load = wx.Button(self.panel,label='CHANGE IMAGE')

        self.btn_image.Bind(wx.EVT_BUTTON,self.onImageTools)
        self.btn_load.Bind(wx.EVT_BUTTON,self.loadIMAGE)

        imagetools.Add(self.btn_load, flag=wx.ALL, border=10) 
        imagetools.Add(self.btn_image, flag=wx.ALL, border=10) 


        self.imagebox.Add(self.plot2Dimg,proportion=1,flag=wx.ALL|wx.EXPAND, border=10)
        self.imagebox.Add(imagetools, flag=wx.ALL, border=10) 

    def write_message(self, s, panel=0):
        """write a message to the Status Bar"""
        self.SetStatusText(s, panel)

    def onImageTools(self,event=None):
        
        self.toolbox = ImageToolboxFrame(self.plot2Dimg,self.raw_img)

    def plot2Dimage(self):
    
        self.plot2Dimg = ImagePanel(self.panel)#,size=(300, 300))
        self.plot2Dimg.messenger = self.write_message

        self.Bind(wx.EVT_PAINT, self.OnPaint)

        self.plot2Dimg.display(self.raw_img) 
        self.AutoContrast()      

        self.plot2Dimg.redraw()

    def AutoContrast(self):
    
        self.minINT = int(np.min(self.raw_img))
        self.maxINT = int(np.max(self.raw_img)/15) # /15 scales image to viewable 
        if self.maxINT == self.minINT:
            self.minINT = self.minINT-50
            self.maxINT = self.minINT+100

        self.minCURRENT = self.minINT
        self.maxCURRENT = self.maxINT
        if self.maxCURRENT > self.maxINT:
            self.maxCURRENT = self.maxINT
        
        self.plot2Dimg.conf.auto_intensity = False        
        self.plot2Dimg.conf.int_lo[0] = self.minCURRENT
        self.plot2Dimg.conf.int_hi[0] = self.maxCURRENT
#         self.plot2Dimg.conf.int_lo['int'] = self.minCURRENT
#         self.plot2Dimg.conf.int_hi['int'] = self.maxCURRENT
        
        ## vertical flip default
        self.plot2Dimg.conf.flip_ud = True
        self.plot2Dimg.conf.flip_lr = False 
       
        self.plot2Dimg.redraw()

    def ShapeChoice(self,event=None):
    
        print('The shape you choose: %s' %  self.ch_shp.GetString(self.ch_shp.GetSelection()))
        
        print()
        print('Not implemented: ShapeChoice')
        self.addAREA()

        
    def OnPaint(self, event=None):
        
        print('Shape : %s' %  self.ch_shp.GetString(self.ch_shp.GetSelection()))
#         dc = wx.PaintDC(self)
#         dc.Clear()
#         dc.SetPen(wx.Pen(wx.BLACK, 4))
#         dc.DrawLine(0, 0, 50, 50)
    
    def clearMask(self,event=None):
        
        print('Clearing the mask...')
        ## provide a warning message?
        self.area_list = []
        self.slct_area.Set(self.area_list)
        
        self.btn_SHWarea.Disable()
        self.btn_DELarea.Disable()
        self.btn_clear.Disable()
        self.btn_save.Disable()
        
        
    def saveMask(self,event=None):

        print('This will trigger the saving of a mask.')
        
    def addAREA(self,event=None):
        area_name = 'area %i (%s)' % (len(self.area_list),self.ch_shp.GetString(self.ch_shp.GetSelection()))
        self.area_list.append(area_name)
        self.slct_area.Set(self.area_list)


        if len(self.area_list) > 0:
            self.btn_SHWarea.Enable()
            self.btn_DELarea.Enable()
            self.btn_clear.Enable()
            self.btn_save.Enable()

    def showAREA(self,event=None):

        if len(self.area_list) > 0:
            area_str = self.slct_area.GetString(self.slct_area.GetSelection())
            str_msg = 'Displaying: %s' % area_str
            self.write_message(str_msg,panel=0)
            
            ## show area on map, image

    def deleteAREA(self,event=None):
    
        if len(self.area_list) > 0:
            area_str = self.slct_area.GetString(self.slct_area.GetSelection())
            str_msg = 'Deleting: %s' % area_str
            self.write_message(str_msg,panel=0)
            
            self.area_list.remove(self.slct_area.GetString(self.slct_area.GetSelection()))
            self.slct_area.Set(self.area_list)
        
        if len(self.area_list) == 0:
            self.btn_SHWarea.Disable()
            self.btn_DELarea.Disable()
            self.btn_clear.Disable()
            self.btn_save.Disable()
コード例 #4
0
ファイル: XRDMaskFrame.py プロジェクト: mrakitin/xraylarch
class MaskToolsPopup(wx.Frame):
    def __init__(self, parent):

        self.frame = wx.Frame.__init__(self,
                                       parent,
                                       title='Create mask',
                                       size=(800, 600))

        self.parent = parent
        self.statusbar = self.CreateStatusBar(2, wx.CAPTION)

        try:
            self.raw_img = parent.plt_img  ## raw_img or flp_img or plt_img mkak 2016.10.28
        except:
            self.loadIMAGE()

        self.setDefaults()

        self.Init()
        self.Show()

#        wx.Window.GetEffectiveMinSize
#        wx.GetBestSize(self)

    def Init(self):

        self.panel = wx.Panel(self)

        self.MainSizer()

        self.framebox = wx.BoxSizer(wx.VERTICAL)
        self.framebox.Add(self.mainbox, flag=wx.ALL | wx.EXPAND, border=10)

        ###########################
        ## Pack all together in self.panel
        self.panel.SetSizer(self.framebox)

    def setDefaults(self):

        self.area_list = []

    def MainSizer(self):

        self.mainbox = wx.BoxSizer(wx.VERTICAL)

        ###########################
        ## -----> Main Panel
        self.hmain = wx.BoxSizer(wx.HORIZONTAL)

        self.ImageSizer()
        self.DrawNewSizer()

        self.hmain.Add(self.imagebox,
                       proportion=1,
                       flag=wx.ALL | wx.EXPAND,
                       border=10)
        self.hmain.Add(self.toolbox, flag=wx.ALL, border=10)

        self.mainbox.Add(self.hmain, flag=wx.ALL | wx.EXPAND, border=10)

    def DrawNewSizer(self):

        self.toolbox = wx.BoxSizer(wx.VERTICAL)

        ###########################
        ## Directions
        nwbx = wx.StaticBox(self.panel, label='Drawing Tools', size=(100, 50))
        drawbox = wx.StaticBoxSizer(nwbx, wx.VERTICAL)

        ###########################
        ## Drawing tools
        hbox_shp = wx.BoxSizer(wx.HORIZONTAL)
        self.txt_shp = wx.StaticText(self.panel, label='DRAWING SHAPE')
        shapes = ['circle', 'pixel', 'polygon', 'square']

        self.ch_shp = wx.Choice(self.panel, choices=shapes)

        self.ch_shp.Bind(wx.EVT_CHOICE, self.ShapeChoice)

        hbox_shp.Add(self.txt_shp, flag=wx.RIGHT, border=8)
        hbox_shp.Add(self.ch_shp, flag=wx.EXPAND, border=8)

        drawbox.Add(hbox_shp, flag=wx.ALL | wx.EXPAND, border=10)

        ###########################
        ## Drawn Areas
        vbox_areas = wx.BoxSizer(wx.VERTICAL)
        hbox_areas = wx.BoxSizer(wx.HORIZONTAL)

        self.slct_area = wx.ListBox(self.panel, 26, wx.DefaultPosition,
                                    (170, 130), self.area_list, wx.LB_SINGLE)

        self.btn_SHWarea = wx.Button(self.panel, label='SHOW')
        self.btn_DELarea = wx.Button(self.panel, label='DELETE')

        self.btn_SHWarea.Bind(wx.EVT_BUTTON, self.showAREA)
        self.btn_DELarea.Bind(wx.EVT_BUTTON, self.deleteAREA)

        hbox_areas.Add(self.btn_SHWarea, flag=wx.BOTTOM, border=10)
        hbox_areas.Add(self.btn_DELarea, flag=wx.BOTTOM, border=10)

        self.btn_clear = wx.Button(self.panel, label='CLEAR ALL')

        self.btn_clear.Bind(wx.EVT_BUTTON, self.clearMask)

        vbox_areas.Add(self.slct_area, flag=wx.ALL | wx.EXPAND, border=10)
        vbox_areas.Add(hbox_areas, flag=wx.ALL | wx.EXPAND, border=10)
        vbox_areas.Add(self.btn_clear, flag=wx.ALL | wx.EXPAND, border=10)
        drawbox.Add(vbox_areas, flag=wx.ALL | wx.EXPAND, border=10)

        self.toolbox.Add(drawbox, flag=wx.ALL, border=10)

        self.btn_save = wx.Button(self.panel, label='SAVE MASK')
        self.btn_save.Bind(wx.EVT_BUTTON, self.saveMask)
        self.toolbox.Add(self.btn_save, flag=wx.ALL, border=10)

        self.btn_SHWarea.Disable()
        self.btn_DELarea.Disable()
        self.btn_clear.Disable()
        self.btn_save.Disable()

    def startIMAGE(self):

        self.loadIMAGE()

    def loadIMAGE(self, event=None):
        wildcards = 'XRD image (*.edf,*.tif,*.tiff)|*.tif;*.tiff;*.edf|All files (*.*)|*.*'
        dlg = wx.FileDialog(self,
                            message='Choose XRD image',
                            defaultDir=os.getcwd(),
                            wildcard=wildcards,
                            style=wx.FD_OPEN)

        path, read = None, False
        if dlg.ShowModal() == wx.ID_OK:
            read = True
            path = dlg.GetPath().replace('\\', '/')
        dlg.Destroy()

        if read:
            try:
                #                 self.raw_img = plt.imread(path)
                self.raw_img = tifffile.imread(path)
                #self.raw_img = fabio.open(path).data
            except:
                print('Image not properly opened.')
                self.raw_img = np.zeros((1024, 1024))
        else:
            print('No image selected.')
            self.raw_img = np.zeros((1024, 1024))

    def ImageSizer(self):
        '''
        Image Panel
        '''
        self.imagebox = wx.BoxSizer(wx.VERTICAL)

        self.plot2Dimage()

        imagetools = wx.BoxSizer(wx.HORIZONTAL)

        self.btn_image = wx.Button(self.panel, label='IMAGE TOOLS')
        self.btn_load = wx.Button(self.panel, label='CHANGE IMAGE')

        self.btn_image.Bind(wx.EVT_BUTTON, self.onImageTools)
        self.btn_load.Bind(wx.EVT_BUTTON, self.loadIMAGE)

        imagetools.Add(self.btn_load, flag=wx.ALL, border=10)
        imagetools.Add(self.btn_image, flag=wx.ALL, border=10)

        self.imagebox.Add(self.plot2Dimg,
                          proportion=1,
                          flag=wx.ALL | wx.EXPAND,
                          border=10)
        self.imagebox.Add(imagetools, flag=wx.ALL, border=10)

    def write_message(self, s, panel=0):
        """write a message to the Status Bar"""
        self.SetStatusText(s, panel)

    def onImageTools(self, event=None):

        self.toolbox = ImageToolboxFrame(self.plot2Dimg, self.raw_img)

    def plot2Dimage(self):

        self.plot2Dimg = ImagePanel(self.panel)  #,size=(300, 300))
        self.plot2Dimg.messenger = self.write_message

        self.Bind(wx.EVT_PAINT, self.OnPaint)

        self.plot2Dimg.display(self.raw_img)
        self.AutoContrast()

        self.plot2Dimg.redraw()

    def AutoContrast(self):

        self.minINT = int(np.min(self.raw_img))
        self.maxINT = int(np.max(self.raw_img) /
                          15)  # /15 scales image to viewable
        if self.maxINT == self.minINT:
            self.minINT = self.minINT - 50
            self.maxINT = self.minINT + 100

        self.minCURRENT = self.minINT
        self.maxCURRENT = self.maxINT
        if self.maxCURRENT > self.maxINT:
            self.maxCURRENT = self.maxINT

        self.plot2Dimg.conf.auto_intensity = False
        self.plot2Dimg.conf.int_lo[0] = self.minCURRENT
        self.plot2Dimg.conf.int_hi[0] = self.maxCURRENT
        #         self.plot2Dimg.conf.int_lo['int'] = self.minCURRENT
        #         self.plot2Dimg.conf.int_hi['int'] = self.maxCURRENT

        ## vertical flip default
        self.plot2Dimg.conf.flip_ud = True
        self.plot2Dimg.conf.flip_lr = False

        self.plot2Dimg.redraw()

    def ShapeChoice(self, event=None):

        print('The shape you choose: %s' %
              self.ch_shp.GetString(self.ch_shp.GetSelection()))

        print()
        print('Not implemented: ShapeChoice')
        self.addAREA()

    def OnPaint(self, event=None):

        print('Shape : %s' % self.ch_shp.GetString(self.ch_shp.GetSelection()))
#         dc = wx.PaintDC(self)
#         dc.Clear()
#         dc.SetPen(wx.Pen(wx.BLACK, 4))
#         dc.DrawLine(0, 0, 50, 50)

    def clearMask(self, event=None):

        print('Clearing the mask...')
        ## provide a warning message?
        self.area_list = []
        self.slct_area.Set(self.area_list)

        self.btn_SHWarea.Disable()
        self.btn_DELarea.Disable()
        self.btn_clear.Disable()
        self.btn_save.Disable()

    def saveMask(self, event=None):

        print('This will trigger the saving of a mask.')

    def addAREA(self, event=None):
        area_name = 'area %i (%s)' % (len(
            self.area_list), self.ch_shp.GetString(self.ch_shp.GetSelection()))
        self.area_list.append(area_name)
        self.slct_area.Set(self.area_list)

        if len(self.area_list) > 0:
            self.btn_SHWarea.Enable()
            self.btn_DELarea.Enable()
            self.btn_clear.Enable()
            self.btn_save.Enable()

    def showAREA(self, event=None):

        if len(self.area_list) > 0:
            area_str = self.slct_area.GetString(self.slct_area.GetSelection())
            str_msg = 'Displaying: %s' % area_str
            self.write_message(str_msg, panel=0)

            ## show area on map, image

    def deleteAREA(self, event=None):

        if len(self.area_list) > 0:
            area_str = self.slct_area.GetString(self.slct_area.GetSelection())
            str_msg = 'Deleting: %s' % area_str
            self.write_message(str_msg, panel=0)

            self.area_list.remove(
                self.slct_area.GetString(self.slct_area.GetSelection()))
            self.slct_area.Set(self.area_list)

        if len(self.area_list) == 0:
            self.btn_SHWarea.Disable()
            self.btn_DELarea.Disable()
            self.btn_clear.Disable()
            self.btn_save.Disable()