Changeset 2592


Ignore:
Timestamp:
Dec 17, 2016 10:33:44 AM (5 years ago)
Author:
toby
Message:

redo scaling for color map sliders

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/GSASIIimgGUI.py

    r2590 r2592  
    510510       
    511511    def MaxSizer():
    512                
    513         def OnMaxVal(invalid,value,tc):
    514             DeltOne = data['range'][1][1]-max(0.0,data['range'][0][0])
    515             sqrtDeltOne = math.sqrt(DeltOne)
    516             maxSel.SetValue(int(100*sqrtDeltOne/sqrtDeltZero))
    517             minSel.SetValue(int(100*(data['range'][1][0]/DeltOne)))
    518             #wx.CallAfter(G2plt.PlotExposedImage,G2frame,event=tc.event)
     512        '''Defines a sizer with sliders and TextCtrl widgets for controlling the colormap
     513        for the image, as well as callback routines.
     514        '''
     515        def OnNewVal(invalid,value,tc):
     516            '''Called when a Imax or Imin value is typed into a Validated TextCrtl (which puts
     517            the value into the data['range'] nested list).
     518            This adjusts the slider positions to match the current values
     519            '''
     520            scaleSel.SetSelection(len(scaleChoices)-1)
     521            r11 = min(max(Range[1][1],Range[1][0]+1),Range[0][1]) # keep values in range
     522            if r11 != Range[1][1]:
     523                Range[1][1] = r11
     524                maxVal.SetValue(int(Range[1][1]))
     525            r10 = max(min(Range[1][0],Range[1][1]-1),Range[0][0])
     526            if r10 != Range[1][0]:
     527                Range[1][0] = r10
     528                minVal.SetValue(int(Range[1][0]))
     529            sqrtDeltZero = math.sqrt(max(1.0,Range[0][1]-max(0.0,Range[1][0])-1)) # sqrt(Imax0-Imin-1)
     530            sqrtDeltOne  = math.sqrt(max(1.0,Range[1][1]-max(0.0,Range[1][0])-1)) # sqrt(Imax-Imin-1)
     531            sv1 = min(100,max(0,int(0.5+100.*sqrtDeltOne/sqrtDeltZero)))
     532            maxSel.SetValue(sv1)
     533            DeltOne  = max(1.0,Range[1][1]-max(0.0,Range[0][0])-1)
     534            sv0 = min(100,max(0,int(0.5+100.*(Range[1][0]-Range[0][0])/DeltOne)))
     535            minSel.SetValue(sv0)
    519536            new,plotNum,Page,Plot,lim = G2frame.G2plotNB.FindPlotTab('2D Powder Image','mpl',newImage=False)
    520             Page.ImgObj.set_clim([data['range'][1][0],data['range'][1][1]])
    521             Page.canvas.draw_idle()
    522            
    523         def OnMinVal(invalid,value,tc):
    524             minSel.SetValue(int(100*(data['range'][1][0]-max(0.0,data['range'][0][0]))/DeltOne))
    525             #wx.CallAfter(G2plt.PlotExposedImage,G2frame,event=tc.event)
    526             new,plotNum,Page,Plot,lim = G2frame.G2plotNB.FindPlotTab('2D Powder Image','mpl',newImage=False)
    527             Page.ImgObj.set_clim([data['range'][1][0],data['range'][1][1]])
    528             Page.canvas.draw_idle()
     537            Page.ImgObj.set_clim([Range[1][0],Range[1][1]])
     538            if mplOld:
     539                Page.canvas.draw()
     540            else:
     541                Page.canvas.draw_idle()
    529542           
    530543        G2frame.prevMaxValue = None   
    531544        def OnMaxSlider(event):
    532             if G2frame.prevMaxValue == maxSel.GetValue(): # if this val has been processed, no need to repeat
    533                 #print 'duplication'
    534                 return
    535             G2frame.prevMaxValue = maxSel.GetValue()
    536             sqrtDeltZero = math.sqrt(data['range'][0][1])
    537             imax = int(maxSel.GetValue())*sqrtDeltZero/100.
    538             data['range'][1][1] = imax**2
    539             data['range'][1][0] = max(0.0,min(data['range'][1][1]-1,data['range'][1][0]))
    540             DeltOne = max(1.0,data['range'][1][1]-data['range'][1][0])
    541             minSel.SetValue(int(100*(data['range'][1][0]/DeltOne)))
    542             maxVal.SetValue(int(data['range'][1][1]))
    543             #wx.CallAfter(G2plt.PlotExposedImage,G2frame,event=event)  # replace with code below for more speed
     545            val = maxSel.GetValue()
     546            if G2frame.prevMaxValue == val: return # if this val has been processed, no need to repeat
     547            scaleSel.SetSelection(len(scaleChoices)-1)
     548            G2frame.prevMaxValue = val
     549            sqrtDeltZero = math.sqrt(max(1.0,Range[0][1]-max(0.0,Range[1][0])-1)) # sqrt(Imax0-Imin-1)
     550            Range[1][1] = int(0.5 + (val * sqrtDeltZero / 100.)**2 + Range[1][0] + 1)
     551            maxVal.SetValue(int(0.5+Range[1][1]))
     552            DeltOne  = max(1.0,Range[1][1]-max(0.0,Range[0][0])-1)
     553            minSel.SetValue(int(0.5 + 100*(Range[1][0]/DeltOne)))
     554            sv0 = min(100,max(0,int(0.5+100.*(Range[1][0]-Range[0][0])/DeltOne)))
     555            minSel.SetValue(sv0)
    544556            new,plotNum,Page,Plot,lim = G2frame.G2plotNB.FindPlotTab('2D Powder Image','mpl',newImage=False)
    545             Page.ImgObj.set_clim([data['range'][1][0],data['range'][1][1]])
    546             Page.canvas.draw_idle()
     557            Page.ImgObj.set_clim([Range[1][0],Range[1][1]])
     558            if mplOld:
     559                Page.canvas.draw()
     560            else:
     561                Page.canvas.draw_idle()
    547562           
    548563        G2frame.prevMinValue = None   
    549564        def OnMinSlider(event):
    550             if G2frame.prevMinValue == minSel.GetValue(): # if this val has been processed, no need to repeat
    551                 #print 'duplication'
    552                 return
    553             G2frame.prevMinValue = minSel.GetValue()
    554             DeltOne = data['range'][1][1]-data['range'][1][0]
    555             imin = int(minSel.GetValue())*DeltOne/100.
    556             data['range'][1][0] = max(0.0,min(data['range'][1][1]-1,imin))
    557             minVal.SetValue(int(data['range'][1][0]))
    558             #wx.CallAfter(G2plt.PlotExposedImage,G2frame,event=event) # replace with code below for more speed
     565            val = minSel.GetValue()
     566            scaleSel.SetSelection(len(scaleChoices)-1)
     567            if G2frame.prevMinValue == val: return # if this val has been processed, no need to repeat
     568            G2frame.prevMinValue = val
     569            DeltOne  = max(1.0,Range[1][1]-max(0.0,Range[0][0])-1) # Imax-Imin0-1
     570            Range[1][0] = max(0,int(0.5 + val * DeltOne / 100 + Range[0][0]))
     571            minVal.SetValue(int(Range[1][0]))
     572            sqrtDeltZero = math.sqrt(max(1.0,Range[0][1]-max(0.0,Range[1][0])-1)) # sqrt(Imax0-Imin-1)
     573            sqrtDeltOne  = math.sqrt(max(1.0,Range[1][1]-max(0.0,Range[1][0])-1)) # sqrt(Imax-Imin-1)
     574            sv1 = min(100,max(0,int(0.5+100.*sqrtDeltOne/sqrtDeltZero)))
     575            maxSel.SetValue(sv1)
    559576            new,plotNum,Page,Plot,lim = G2frame.G2plotNB.FindPlotTab('2D Powder Image','mpl',newImage=False)
    560             Page.ImgObj.set_clim([data['range'][1][0],data['range'][1][1]])
    561             Page.canvas.draw_idle()
     577            Page.ImgObj.set_clim([Range[1][0],Range[1][1]])
     578            if mplOld:
     579                Page.canvas.draw()
     580            else:
     581                Page.canvas.draw_idle()
     582           
    562583        def OnAutoSet(event):
    563584            '''Responds to a button labeled 95%, etc; Sets the Imax and Imin values
     
    573594            new,plotNum,Page,Plot,lim = G2frame.G2plotNB.FindPlotTab('2D Powder Image','mpl',newImage=False)
    574595            if margin == 0:
    575                 data['range'][1] = list(data['range'][0])
     596                Range[1] = list(Range[0])
    576597            else:
    577                 data['range'][1][0] = int(np.percentile(Page.ImgObj.get_array().compressed(),margin))
    578                 data['range'][1][1] = int(np.percentile(Page.ImgObj.get_array().compressed(),100-margin))
    579             DeltOne = data['range'][1][1]-max(0.0,data['range'][0][0])
    580             sqrtDeltOne = math.sqrt(DeltOne)
    581             maxSel.SetValue(int(100*sqrtDeltOne/sqrtDeltZero))
    582             minSel.SetValue(int(100*(data['range'][1][0]/DeltOne)))
    583             maxVal.SetValue(int(data['range'][1][1]))
    584             minVal.SetValue(int(data['range'][1][0]))
    585             Page.ImgObj.set_clim([data['range'][1][0],data['range'][1][1]])
    586             Page.canvas.draw_idle()
    587            
     598                Range[1][0] = int(np.percentile(Page.ImgObj.get_array().compressed(),margin))
     599                Range[1][1] = int(np.percentile(Page.ImgObj.get_array().compressed(),100-margin))
     600            sqrtDeltZero = math.sqrt(max(1.0,Range[0][1]-max(0.0,Range[1][0])-1)) # sqrt(Imax0-Imin-1)
     601            sqrtDeltOne  = math.sqrt(max(1.0,Range[1][1]-max(0.0,Range[1][0])-1)) # sqrt(Imax-Imin-1)
     602            sv1 = min(100,max(0,int(0.5+100.*sqrtDeltOne/sqrtDeltZero)))
     603            maxSel.SetValue(sv1)
     604            DeltOne  = max(1.0,Range[1][1]-max(0.0,Range[0][0])-1)
     605            sv0 = min(100,max(0,int(0.5+100.*(Range[1][0]-Range[0][0])/DeltOne)))
     606            minSel.SetValue(sv0)
     607            minVal.SetValue(int(Range[1][0]))
     608            maxVal.SetValue(int(Range[1][1]))
     609            new,plotNum,Page,Plot,lim = G2frame.G2plotNB.FindPlotTab('2D Powder Image','mpl',newImage=False)
     610            Page.ImgObj.set_clim([Range[1][0],Range[1][1]])
     611            if mplOld:
     612                Page.canvas.draw()
     613            else:
     614                Page.canvas.draw_idle()
     615
     616        mplv = mpl.__version__.split('.')
     617        mplOld = mplv[0] == '1' and int(mplv[1]) < 4 # use draw_idle for newer matplotlib versions
     618        # Plot color scaling uses limits as below:
     619        #   (Imin0, Imax0) => Range[0] = data['range'][0] # lowest to highest pixel intensity
     620        #   [Imin, Imax] => Range[1] = data['range'][1] #   lowest to highest pixel intensity on cmap scale
    588621        maxSizer = wx.GridBagSizer(0,0)
    589         sqrtDeltZero = max(1.0,math.sqrt(data['range'][0][1]-max(0.0,data['range'][0][0])))
    590         DeltOne = max(1.0,data['range'][1][1]-max(0.0,data['range'][0][0]))
    591         sqrtDeltOne = math.sqrt(DeltOne)
    592622        r = c = 0
    593623        maxSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Max intensity'),(r,c))
    594624        c += 1
    595         maxSel = wx.Slider(parent=G2frame.dataDisplay,style=wx.SL_HORIZONTAL,
    596             value=int(100*sqrtDeltOne/sqrtDeltZero))
     625        # maxSel is a slider with 101 steps scaled from Imin+1 to Imax0 with sqrt scaling
     626        # slider value = sv = 100 * sqrt((Imax-Imin-1)/(Imax0-Imin-1))
     627        # Imax = (sv * sqrt(Imax0-Imin-1) / 100)**2 + Imin + 1
     628        sqrtDeltZero = math.sqrt(max(1.0,Range[0][1]-max(0.0,Range[1][0])-1)) # sqrt(Imax0-Imin-1)
     629        sqrtDeltOne  = math.sqrt(max(1.0,Range[1][1]-max(0.0,Range[1][0])-1)) # sqrt(Imax-Imin-1)
     630        sv1 = min(100,max(0,int(0.5+100.*sqrtDeltOne/sqrtDeltZero)))
     631        maxSel = wx.Slider(parent=G2frame.dataDisplay,style=wx.SL_HORIZONTAL,value=sv1,size=(300,-1))
    597632        maxSizer.Add(maxSel,(r,c),flag=wx.EXPAND)
    598633        maxSizer.AddGrowableCol(c)
    599634        c += 1
    600635        maxSel.Bind(wx.EVT_SLIDER, OnMaxSlider)
    601         maxVal = G2G.ValidatedTxtCtrl(G2frame.dataDisplay,data['range'][1],1,min=data['range'][0][0]+1,
    602             max=data['range'][0][1]-1,typeHint=int,OnLeave=OnMaxVal)
     636        maxVal = G2G.ValidatedTxtCtrl(G2frame.dataDisplay,Range[1],1,min=Range[0][0]+1,
     637            max=Range[0][1],typeHint=int,OnLeave=OnNewVal)
    603638        maxSizer.Add(maxVal,(r,c))
    604639        c += 1
    605         scaleSel = wx.Choice(G2frame.dataDisplay,choices=("100%","99%","95%","90%","80%"),size=(-1,-1))
    606         if (data['range'][1][0] == data['range'][0][0] and
    607             data['range'][1][1] == data['range'][0][1]):
     640        scaleChoices = ("100%","99%","95%","90%","80%","?")
     641        scaleSel = wx.Choice(G2frame.dataDisplay,choices=scaleChoices,size=(-1,-1))
     642        if (Range[1][0] == Range[0][0] and
     643            Range[1][1] == Range[0][1]):
    608644            scaleSel.SetSelection(0)
    609645        else:
    610             scaleSel.SetLabel("?%")
     646            scaleSel.SetSelection(len(scaleChoices)-1)
    611647        scaleSel.Bind(wx.EVT_CHOICE,OnAutoSet)
    612648        maxSizer.Add(scaleSel,(r,c),(2,1),flag=wx.ALIGN_CENTER)
     
    615651        maxSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Min intensity'),(r,c))
    616652        c += 1
    617         minSel = wx.Slider(parent=G2frame.dataDisplay,style=wx.SL_HORIZONTAL,
    618             value=int(100*(data['range'][1][0]-max(0.0,data['range'][0][0]))/DeltOne))
     653        # minSel is a slider with 101 steps scaled from Imin0 to Imax-1 with linear scaling
     654        # slider value = sv0 = 100 * (Imin-Imin0)/(Imax-Imin0-1)
     655        # Imin = sv0 * (Imax-Imin0-1) / 100 + Imin0
     656        DeltOne  = max(1.0,Range[1][1]-max(0.0,Range[0][0])-1) # Imax-Imin0-1
     657        sv0 = min(100,max(0,int(0.5+100.*(Range[1][0]-Range[0][0])/DeltOne)))
     658        minSel = wx.Slider(parent=G2frame.dataDisplay,style=wx.SL_HORIZONTAL,value=sv0,size=(300,-1))
    619659        maxSizer.Add(minSel,(r,c),flag=wx.EXPAND|wx.ALL)
    620660        c += 1
    621661        minSel.Bind(wx.EVT_SLIDER, OnMinSlider)
    622         minVal = G2G.ValidatedTxtCtrl(G2frame.dataDisplay,data['range'][1],0,
    623             max=data['range'][0][1],typeHint=int,OnLeave=OnMinVal)
     662        minVal = G2G.ValidatedTxtCtrl(G2frame.dataDisplay,Range[1],0,
     663            max=Range[0][1],typeHint=int,OnLeave=OnNewVal)
    624664        maxSizer.Add(minVal,(r,c))
    625665        return maxSizer
     
    10891129    mainSizer.Add(ComboSizer(),0,wx.ALIGN_LEFT)
    10901130    mainSizer.Add((5,5),0)
     1131    Range = data['range'] # allows code to be same in Masks
    10911132    MaxSizer = MaxSizer()               #keep this so it can be changed in BackSizer   
    10921133    mainSizer.Add(MaxSizer,0,wx.ALIGN_LEFT|wx.EXPAND|wx.ALL)
     
    12621303        G2frame.MaskKey = 'f'
    12631304        G2plt.OnStartMask(G2frame)
     1305       
     1306    def MaxSizer():
     1307        '''Defines a sizer with sliders and TextCtrl widgets for controlling the colormap
     1308        for the image, as well as callback routines.
     1309        '''
     1310        def OnNewVal(invalid,value,tc):
     1311            '''Called when a Imax or Imin value is typed into a Validated TextCrtl (which puts
     1312            the value into the data['range'] nested list).
     1313            This adjusts the slider positions to match the current values
     1314            '''
     1315            scaleSel.SetSelection(len(scaleChoices)-1)
     1316            r11 = min(max(Range[1][1],Range[1][0]+1),Range[0][1]) # keep values in range
     1317            if r11 != Range[1][1]:
     1318                Range[1][1] = r11
     1319                maxVal.SetValue(int(Range[1][1]))
     1320            r10 = max(min(Range[1][0],Range[1][1]-1),Range[0][0])
     1321            if r10 != Range[1][0]:
     1322                Range[1][0] = r10
     1323                minVal.SetValue(int(Range[1][0]))
     1324            sqrtDeltZero = math.sqrt(max(1.0,Range[0][1]-max(0.0,Range[1][0])-1)) # sqrt(Imax0-Imin-1)
     1325            sqrtDeltOne  = math.sqrt(max(1.0,Range[1][1]-max(0.0,Range[1][0])-1)) # sqrt(Imax-Imin-1)
     1326            sv1 = min(100,max(0,int(0.5+100.*sqrtDeltOne/sqrtDeltZero)))
     1327            maxSel.SetValue(sv1)
     1328            DeltOne  = max(1.0,Range[1][1]-max(0.0,Range[0][0])-1)
     1329            sv0 = min(100,max(0,int(0.5+100.*(Range[1][0]-Range[0][0])/DeltOne)))
     1330            minSel.SetValue(sv0)
     1331            new,plotNum,Page,Plot,lim = G2frame.G2plotNB.FindPlotTab('2D Powder Image','mpl',newImage=False)
     1332            Page.ImgObj.set_clim([Range[1][0],Range[1][1]])
     1333            if mplOld:
     1334                Page.canvas.draw()
     1335            else:
     1336                Page.canvas.draw_idle()
     1337           
     1338        G2frame.prevMaxValue = None   
     1339        def OnMaxSlider(event):
     1340            val = maxSel.GetValue()
     1341            if G2frame.prevMaxValue == val: return # if this val has been processed, no need to repeat
     1342            scaleSel.SetSelection(len(scaleChoices)-1)
     1343            G2frame.prevMaxValue = val
     1344            sqrtDeltZero = math.sqrt(max(1.0,Range[0][1]-max(0.0,Range[1][0])-1)) # sqrt(Imax0-Imin-1)
     1345            Range[1][1] = int(0.5 + (val * sqrtDeltZero / 100.)**2 + Range[1][0] + 1)
     1346            maxVal.SetValue(int(0.5+Range[1][1]))
     1347            DeltOne  = max(1.0,Range[1][1]-max(0.0,Range[0][0])-1)
     1348            minSel.SetValue(int(0.5 + 100*(Range[1][0]/DeltOne)))
     1349            sv0 = min(100,max(0,int(0.5+100.*(Range[1][0]-Range[0][0])/DeltOne)))
     1350            minSel.SetValue(sv0)
     1351            new,plotNum,Page,Plot,lim = G2frame.G2plotNB.FindPlotTab('2D Powder Image','mpl',newImage=False)
     1352            Page.ImgObj.set_clim([Range[1][0],Range[1][1]])
     1353            if mplOld:
     1354                Page.canvas.draw()
     1355            else:
     1356                Page.canvas.draw_idle()
     1357           
     1358        G2frame.prevMinValue = None   
     1359        def OnMinSlider(event):
     1360            val = minSel.GetValue()
     1361            scaleSel.SetSelection(len(scaleChoices)-1)
     1362            if G2frame.prevMinValue == val: return # if this val has been processed, no need to repeat
     1363            G2frame.prevMinValue = val
     1364            DeltOne  = max(1.0,Range[1][1]-max(0.0,Range[0][0])-1) # Imax-Imin0-1
     1365            Range[1][0] = max(0,int(0.5 + val * DeltOne / 100 + Range[0][0]))
     1366            minVal.SetValue(int(Range[1][0]))
     1367            sqrtDeltZero = math.sqrt(max(1.0,Range[0][1]-max(0.0,Range[1][0])-1)) # sqrt(Imax0-Imin-1)
     1368            sqrtDeltOne  = math.sqrt(max(1.0,Range[1][1]-max(0.0,Range[1][0])-1)) # sqrt(Imax-Imin-1)
     1369            sv1 = min(100,max(0,int(0.5+100.*sqrtDeltOne/sqrtDeltZero)))
     1370            maxSel.SetValue(sv1)
     1371            new,plotNum,Page,Plot,lim = G2frame.G2plotNB.FindPlotTab('2D Powder Image','mpl',newImage=False)
     1372            Page.ImgObj.set_clim([Range[1][0],Range[1][1]])
     1373            if mplOld:
     1374                Page.canvas.draw()
     1375            else:
     1376                Page.canvas.draw_idle()
     1377           
     1378        def OnAutoSet(event):
     1379            '''Responds to a button labeled 95%, etc; Sets the Imax and Imin values
     1380            for the image so that 95% (etc.) of pixels are inside the color map limits.
     1381            An equal number of pixels are dropped at the minimum and maximum levels.
     1382            '''
     1383            try:
     1384                val = int(event.GetEventObject().GetStringSelection()[:-1])
     1385                margin = (100-val)/2.
     1386            except:
     1387                margin = 0
     1388                event.GetEventObject().SetSelection(0)
     1389            new,plotNum,Page,Plot,lim = G2frame.G2plotNB.FindPlotTab('2D Powder Image','mpl',newImage=False)
     1390            if margin == 0:
     1391                Range[1] = list(Range[0])
     1392            else:
     1393                Range[1][0] = int(np.percentile(Page.ImgObj.get_array().compressed(),margin))
     1394                Range[1][1] = int(np.percentile(Page.ImgObj.get_array().compressed(),100-margin))
     1395            sqrtDeltZero = math.sqrt(max(1.0,Range[0][1]-max(0.0,Range[1][0])-1)) # sqrt(Imax0-Imin-1)
     1396            sqrtDeltOne  = math.sqrt(max(1.0,Range[1][1]-max(0.0,Range[1][0])-1)) # sqrt(Imax-Imin-1)
     1397            sv1 = min(100,max(0,int(0.5+100.*sqrtDeltOne/sqrtDeltZero)))
     1398            maxSel.SetValue(sv1)
     1399            DeltOne  = max(1.0,Range[1][1]-max(0.0,Range[0][0])-1)
     1400            sv0 = min(100,max(0,int(0.5+100.*(Range[1][0]-Range[0][0])/DeltOne)))
     1401            minSel.SetValue(sv0)
     1402            minVal.SetValue(int(Range[1][0]))
     1403            maxVal.SetValue(int(Range[1][1]))
     1404            new,plotNum,Page,Plot,lim = G2frame.G2plotNB.FindPlotTab('2D Powder Image','mpl',newImage=False)
     1405            Page.ImgObj.set_clim([Range[1][0],Range[1][1]])
     1406            if mplOld:
     1407                Page.canvas.draw()
     1408            else:
     1409                Page.canvas.draw_idle()
     1410
     1411        mplv = mpl.__version__.split('.')
     1412        mplOld = mplv[0] == '1' and int(mplv[1]) < 4 # use draw_idle for newer matplotlib versions
     1413        # Plot color scaling uses limits as below:
     1414        #   (Imin0, Imax0) => Range[0] = data['range'][0] # lowest to highest pixel intensity
     1415        #   [Imin, Imax] => Range[1] = data['range'][1] #   lowest to highest pixel intensity on cmap scale
     1416        maxSizer = wx.GridBagSizer(0,0)
     1417        r = c = 0
     1418        maxSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Max intensity'),(r,c))
     1419        c += 1
     1420        # maxSel is a slider with 101 steps scaled from Imin+1 to Imax0 with sqrt scaling
     1421        # slider value = sv = 100 * sqrt((Imax-Imin-1)/(Imax0-Imin-1))
     1422        # Imax = (sv * sqrt(Imax0-Imin-1) / 100)**2 + Imin + 1
     1423        sqrtDeltZero = math.sqrt(max(1.0,Range[0][1]-max(0.0,Range[1][0])-1)) # sqrt(Imax0-Imin-1)
     1424        sqrtDeltOne  = math.sqrt(max(1.0,Range[1][1]-max(0.0,Range[1][0])-1)) # sqrt(Imax-Imin-1)
     1425        sv1 = min(100,max(0,int(0.5+100.*sqrtDeltOne/sqrtDeltZero)))
     1426        maxSel = wx.Slider(parent=G2frame.dataDisplay,style=wx.SL_HORIZONTAL,value=sv1,size=(300,-1))
     1427        maxSizer.Add(maxSel,(r,c),flag=wx.EXPAND)
     1428        maxSizer.AddGrowableCol(c)
     1429        c += 1
     1430        maxSel.Bind(wx.EVT_SLIDER, OnMaxSlider)
     1431        maxVal = G2G.ValidatedTxtCtrl(G2frame.dataDisplay,Range[1],1,min=Range[0][0]+1,
     1432            max=Range[0][1],typeHint=int,OnLeave=OnNewVal)
     1433        maxSizer.Add(maxVal,(r,c))
     1434        c += 1
     1435        scaleChoices = ("100%","99%","95%","90%","80%","?")
     1436        scaleSel = wx.Choice(G2frame.dataDisplay,choices=scaleChoices,size=(-1,-1))
     1437        if (Range[1][0] == Range[0][0] and
     1438            Range[1][1] == Range[0][1]):
     1439            scaleSel.SetSelection(0)
     1440        else:
     1441            scaleSel.SetSelection(len(scaleChoices)-1)
     1442        scaleSel.Bind(wx.EVT_CHOICE,OnAutoSet)
     1443        maxSizer.Add(scaleSel,(r,c),(2,1),flag=wx.ALIGN_CENTER)
     1444        c = 0
     1445        r = 1
     1446        maxSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Min intensity'),(r,c))
     1447        c += 1
     1448        # minSel is a slider with 101 steps scaled from Imin0 to Imax-1 with linear scaling
     1449        # slider value = sv0 = 100 * (Imin-Imin0)/(Imax-Imin0-1)
     1450        # Imin = sv0 * (Imax-Imin0-1) / 100 + Imin0
     1451        DeltOne  = max(1.0,Range[1][1]-max(0.0,Range[0][0])-1) # Imax-Imin0-1
     1452        sv0 = min(100,max(0,int(0.5+100.*(Range[1][0]-Range[0][0])/DeltOne)))
     1453        minSel = wx.Slider(parent=G2frame.dataDisplay,style=wx.SL_HORIZONTAL,value=sv0,size=(300,-1))
     1454        maxSizer.Add(minSel,(r,c),flag=wx.EXPAND|wx.ALL)
     1455        c += 1
     1456        minSel.Bind(wx.EVT_SLIDER, OnMinSlider)
     1457        minVal = G2G.ValidatedTxtCtrl(G2frame.dataDisplay,Range[1],0,
     1458            max=Range[0][1],typeHint=int,OnLeave=OnNewVal)
     1459        maxSizer.Add(minVal,(r,c))
     1460        return maxSizer
    12641461
    12651462    startScroll = None
     
    13101507    CId = G2gd.GetPatternTreeItemId(G2frame,G2frame.Image,'Image Controls')
    13111508    controlData = G2frame.PatternTree.GetItemPyData(CId)
    1312     def OnMaxVal(invalid,value,tc):
    1313         DeltOne = controlData['range'][1][1]-max(0.0,controlData['range'][0][0])
    1314         sqrtDeltOne = math.sqrt(DeltOne)
    1315         maxSel.SetValue(int(100*sqrtDeltOne/sqrtDeltZero))
    1316         minSel.SetValue(int(100*(controlData['range'][1][0]/DeltOne)))
    1317         #wx.CallAfter(G2plt.PlotExposedImage,G2frame,event=tc.event)
    1318         new,plotNum,Page,Plot,lim = G2frame.G2plotNB.FindPlotTab('2D Powder Image','mpl',newImage=False)
    1319         Page.ImgObj.set_clim([controlData['range'][1][0],controlData['range'][1][1]])
    1320         Page.canvas.draw_idle()
    1321            
    1322     def OnMinVal(invalid,value,tc):
    1323         minSel.SetValue(int(100*(controlData['range'][1][0]-max(0.0,controlData['range'][0][0]))/DeltOne))
    1324         #wx.CallAfter(G2plt.PlotExposedImage,G2frame,event=tc.event)
    1325         new,plotNum,Page,Plot,lim = G2frame.G2plotNB.FindPlotTab('2D Powder Image','mpl',newImage=False)
    1326         Page.ImgObj.set_clim([controlData['range'][1][0],controlData['range'][1][1]])
    1327         Page.canvas.draw_idle()
    1328 
    1329     G2frame.prevMaxValue = None   
    1330     def OnMaxSlider(event):
    1331         if G2frame.prevMaxValue == maxSel.GetValue(): # if this val has been processed, no need to repeat
    1332             return
    1333         G2frame.prevMaxValue = maxSel.GetValue()
    1334         sqrtDeltZero = math.sqrt(controlData['range'][0][1])
    1335         imax = int(maxSel.GetValue())*sqrtDeltZero/100.
    1336         controlData['range'][1][1] = imax**2
    1337         controlData['range'][1][0] = max(0.0,min(controlData['range'][1][1]-1,controlData['range'][1][0]))
    1338         DeltOne = max(1.0,controlData['range'][1][1]-controlData['range'][1][0])
    1339         minSel.SetValue(int(100*(controlData['range'][1][0]/DeltOne)))
    1340         maxVal.SetValue(int(controlData['range'][1][1]))
    1341         #wx.CallAfter(G2plt.PlotExposedImage,G2frame,event=event)  # replace with code below for more speed
    1342         new,plotNum,Page,Plot,lim = G2frame.G2plotNB.FindPlotTab('2D Powder Image','mpl',newImage=False)
    1343         Page.ImgObj.set_clim([controlData['range'][1][0],controlData['range'][1][1]])
    1344         Page.canvas.draw_idle()
    1345 
    1346     G2frame.prevMinValue = None   
    1347     def OnMinSlider(event):
    1348         if G2frame.prevMinValue == minSel.GetValue(): # if this val has been processed, no need to repeat
    1349             return
    1350         G2frame.prevMinValue = minSel.GetValue()
    1351         DeltOne = controlData['range'][1][1]-controlData['range'][1][0]
    1352         imin = int(minSel.GetValue())*DeltOne/100.
    1353         controlData['range'][1][0] = max(0.0,min(controlData['range'][1][1]-1,imin))
    1354         minVal.SetValue(int(controlData['range'][1][0]))
    1355         #wx.CallAfter(G2plt.PlotExposedImage,G2frame,event=event) # replace with code below for more speed
    1356         new,plotNum,Page,Plot,lim = G2frame.G2plotNB.FindPlotTab('2D Powder Image','mpl',newImage=False)
    1357         Page.ImgObj.set_clim([controlData['range'][1][0],controlData['range'][1][1]])
    1358         Page.canvas.draw_idle()
    1359     def OnAutoSet(event):
    1360         '''Responds to a button labeled 95%, etc; Sets the Imax and Imin values
    1361         for the image so that 95% (etc.) of pixels are inside the color map limits.
    1362         An equal number of pixels are dropped at the minimum and maximum levels.
    1363         '''
    1364         try:
    1365             val = int(event.GetEventObject().GetStringSelection()[:-1])
    1366             margin = (100-val)/2.
    1367         except:
    1368             margin = 0
    1369             event.GetEventObject().SetSelection(0)
    1370         new,plotNum,Page,Plot,lim = G2frame.G2plotNB.FindPlotTab('2D Powder Image','mpl',newImage=False)
    1371         if margin == 0:
    1372             controlData['range'][1] = list(controlData['range'][0])
    1373         else:
    1374             controlData['range'][1][0] = int(np.percentile(Page.ImgObj.get_array().compressed(),margin))
    1375             controlData['range'][1][1] = int(np.percentile(Page.ImgObj.get_array().compressed(),100-margin))
    1376         DeltOne = controlData['range'][1][1]-max(0.0,controlData['range'][0][0])
    1377         sqrtDeltOne = math.sqrt(DeltOne)
    1378         maxSel.SetValue(int(100*sqrtDeltOne/sqrtDeltZero))
    1379         minSel.SetValue(int(100*(controlData['range'][1][0]/DeltOne)))
    1380         maxVal.SetValue(int(controlData['range'][1][1]))
    1381         minVal.SetValue(int(controlData['range'][1][0]))
    1382         Page.ImgObj.set_clim([controlData['range'][1][0],controlData['range'][1][1]])
    1383         Page.canvas.draw_idle()
    1384 
    1385     maxSizer = wx.GridBagSizer(0,0)
    1386     sqrtDeltZero = max(1.0,math.sqrt(controlData['range'][0][1]-max(0.0,controlData['range'][0][0])))
    1387     DeltOne = max(1.0,controlData['range'][1][1]-max(0.0,controlData['range'][0][0]))
    1388     sqrtDeltOne = math.sqrt(DeltOne)
    1389     r = c = 0
    1390     maxSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Max intensity'),(r,c))
    1391     c += 1
    1392     maxSel = wx.Slider(parent=G2frame.dataDisplay,style=wx.SL_HORIZONTAL,
    1393         value=int(100*sqrtDeltOne/sqrtDeltZero),size=[300,-1])
    1394     maxSizer.Add(maxSel,(r,c),flag=wx.EXPAND)
    1395     maxSizer.AddGrowableCol(c)
    1396     c += 1
    1397     maxSel.Bind(wx.EVT_SLIDER, OnMaxSlider)
    1398     maxVal = G2G.ValidatedTxtCtrl(G2frame.dataDisplay,controlData['range'][1],1,min=controlData['range'][0][0]+1,
    1399         max=controlData['range'][0][1]-1,typeHint=int,OnLeave=OnMaxVal)
    1400     maxSizer.Add(maxVal,(r,c))
    1401     c += 1
    1402     scaleSel = wx.Choice(G2frame.dataDisplay,choices=("100%","99%","95%","90%","80%"),size=(-1,-1))
    1403     if (controlData['range'][1][0] == controlData['range'][0][0] and
    1404         controlData['range'][1][1] == controlData['range'][0][1]):
    1405         scaleSel.SetSelection(0)
    1406     else:
    1407         scaleSel.SetLabelText("?%")
    1408     scaleSel.Bind(wx.EVT_CHOICE,OnAutoSet)
    1409     maxSizer.Add(scaleSel,(r,c),(2,1),flag=wx.ALIGN_CENTER)
    1410     c = 0
    1411     r = 1
    1412     maxSizer.Add(wx.StaticText(parent=G2frame.dataDisplay,label=' Min intensity'),(r,c))
    1413     c += 1
    1414     minSel = wx.Slider(parent=G2frame.dataDisplay,style=wx.SL_HORIZONTAL,
    1415         value=int(100*(controlData['range'][1][0]-max(0.0,controlData['range'][0][0]))/DeltOne))
    1416     maxSizer.Add(minSel,(r,c),flag=wx.EXPAND|wx.ALL)
    1417     c += 1
    1418     minSel.Bind(wx.EVT_SLIDER, OnMinSlider)
    1419     minVal = G2G.ValidatedTxtCtrl(G2frame.dataDisplay,controlData['range'][1],0,
    1420         max=controlData['range'][0][1],typeHint=int,OnLeave=OnMinVal)
    1421     maxSizer.Add(minVal,(r,c))
    1422     mainSizer.Add(maxSizer,0,wx.ALIGN_LEFT|wx.EXPAND)
     1509    Range = controlData['range']
     1510    MaxSizer = MaxSizer()               #keep this so it can be changed in BackSizer   
     1511    mainSizer.Add(MaxSizer,0,wx.ALIGN_LEFT|wx.EXPAND|wx.ALL)
    14231512
    14241513    littleSizer = wx.FlexGridSizer(0,3,0,5)
Note: See TracChangeset for help on using the changeset viewer.