Changeset 49


Ignore:
Timestamp:
Apr 20, 2010 1:10:20 PM (12 years ago)
Author:
vondreel
Message:

resolved zoom issues with peak picking, etc.
further steps for image integration

Location:
trunk
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/GSASII.py

    r48 r49  
    236236        self.Image = 0
    237237        self.Img = 0
     238        self.TA = 0
    238239        self.Pwdr = False
    239240        self.imageDefault = {}
     
    251252            pltPage = self.G2plotNB.nb.GetPage(pltNum)
    252253            pltPlot = pltPage.figure.gca()
    253             pltPage.xylim = [pltPlot.get_xlim(),pltPlot.get_ylim()]
    254             pltPage.views = copy.deepcopy(pltPage.toolbar._views)
     254#            pltPage.xylim = [pltPlot.get_xlim(),pltPlot.get_ylim()]
     255#            print pltPage.xylim
     256#            pltPage.views = copy.deepcopy(pltPage.toolbar._views)
    255257        item = event.GetItem()
    256258        G2gd.MovePatternTreeToGrid(self,item)
     
    411413                        Data['LRazimuth'] = [-135,-45]
    412414                        Data['outChannels'] = 2500
     415                        Data['outAzimuths'] = 1
    413416                        Data['fullIntegrate'] = False
    414417                        Data['setRings'] = False
     
    773776    def OnFileOpenMenu(self, event):
    774777        result = ''
     778        Id = 0
    775779        if self.PatternTree.GetChildrenCount(self.root,False):
    776780            if self.dataFrame:
     
    796800                    self.PatternTree.Expand(self.root)
    797801                    self.HKL = []
     802                    item, cookie = self.PatternTree.GetFirstChild(self.root)
     803                    while item and not Id:
     804                        name = self.PatternTree.GetItemText(item)
     805                        if 'PWDR' in name or 'SXTL' in name or 'IMG' in name:
     806                            Id = item
     807                        item, cookie = self.PatternTree.GetNextChild(self.root, cookie)               
     808                    if Id:
     809                        self.PatternTree.SelectItem(Id)
    798810            finally:
    799811                dlg.Destroy()
  • trunk/GSASIIIO.py

    r44 r49  
    513513    print 'Read APS PE-detector tiff file: ',filename
    514514    File = open(filename,'Ur')
    515     Meta = open(filename+'.metadata','Ur')
     515    dataType = 5
     516    try:
     517        Meta = open(filename+'.metadata','Ur')
     518        head = Meta.readlines()
     519        for line in head:
     520            line = line.strip()
     521            if 'dataType' in line:
     522                dataType = int(line.split('=')[1])
     523        Meta.close()
     524    except IOError:
     525        print 'no metadata file found - will try to read file anyway'
     526        head = 'no metadata file found'
    516527    tag = File.read(3)
    517528    if tag != 'II*':
    518529        lines = ['not a APS PE-detector tiff file',]
    519530        return lines,0,0
    520     head = Meta.readlines()
    521     dataType = 0
    522     for line in head:
    523         line = line.strip()
    524         if 'dataType' in line:
    525             dataType = int(line.split('=')[1])
    526531    size = st.unpack('<i',File.read(4))[0]
    527532    image = np.zeros(shape=(size,size),dtype=np.int32)
  • trunk/GSASIIcomp.py

    r48 r49  
    4242acosd = lambda x: 180.*math.acos(x)/math.pi
    4343rdsq2d = lambda x,p: round(1.0/math.sqrt(x),p)
     44#numpy versions
     45npsind = lambda x: np.sin(x*np.pi/180.)
     46npasind = lambda x: 180.*np.arcsin(x)/math.pi
     47npcosd = lambda x: np.cos(x*math.pi/180.)
     48nptand = lambda x: np.tan(x*math.pi/180.)
     49npatand = lambda x: 180.*np.arctan(x)/np.pi
     50npatan2d = lambda y,x: 180.*np.arctan2(y,x)/np.pi
    4451
    4552def sec2HMS(sec):
     
    504511    cs = cosd(Angle)
    505512    ss = sind(Angle)
    506     M = np.array(([1,0,0],[0,cs,-ss],[0,ss,cs]))
     513    M = np.array(([1.,0.,0.],[0.,cs,-ss],[0.,ss,cs]),dtype=np.float32)
    507514    return np.roll(np.roll(M,Axis,axis=0),Axis,axis=1)
    508515                   
     
    12091216    Err,parms = FitCircle(ring)
    12101217    Err /= len(ring)
    1211     print 'circle error:','%8f'%(Err)
     1218#    print 'circle error:','%8f'%(Err)
    12121219    if Err > 20000.:
    12131220        eparms = FitEllipse(ring)
     
    12741281    from scipy.optimize import leastsq
    12751282    def ellipseCalc(B,xyd,wave):
    1276         sind = lambda x: np.sin(x*math.pi/180.)
    1277         asind = lambda x: 180.*np.arcsin(x)/math.pi
    1278         cosd = lambda x: np.cos(x*math.pi/180.)
    1279         tand = lambda x: np.tan(x*math.pi/180.)
    12801283        x = xyd[0]
    12811284        y = xyd[1]
    12821285        dsp = xyd[2]
    12831286        dist,x0,y0,phi,tilt = B
    1284         tth = 2.0*asind(wave/(2.*dsp))
    1285         ttth = tand(tth)
     1287        tth = 2.0*npasind(wave/(2.*dsp))
     1288        ttth = nptand(tth)
    12861289        radius = dist*ttth
    1287         stth = sind(tth)
    1288         cosb = cosd(tilt)
    1289         R1 = dist*stth*cosd(tth)*cosb/(cosb**2-stth**2)
     1290        stth = npsind(tth)
     1291        cosb = npcosd(tilt)
     1292        R1 = dist*stth*npcosd(tth)*cosb/(cosb**2-stth**2)
    12901293        R0 = np.sqrt(R1*radius*cosb)
    1291         zdis = R1*ttth*tand(tilt)
    1292         X = x-x0+zdis*sind(phi)
    1293         Y = y-y0-zdis*cosd(phi)
    1294         XR = X*cosd(phi)-Y*sind(phi)
    1295         YR = X*sind(phi)+Y*cosd(phi)
     1294        zdis = R1*ttth*nptand(tilt)
     1295        X = x-x0+zdis*npsind(phi)
     1296        Y = y-y0-zdis*npcosd(phi)
     1297        XR = X*npcosd(phi)-Y*npsind(phi)
     1298        YR = X*npsind(phi)+Y*npcosd(phi)
    12961299        return (XR/R0)**2+(YR/R1)**2-1
    12971300    result = leastsq(ellipseCalc,p0,args=(rings.T,wave))
    12981301    return result[0]
    1299 
    13001302           
    13011303def ImageLocalMax(image,w,Xpix,Ypix):
     
    14001402                   
    14011403def GetTthDspAzm(x,y,data):
    1402     #make numpy array compliant
    1403     atand = lambda x: 180.*np.arctan(x)/np.pi
    1404     sind = lambda x: np.sin(x*np.pi/180.)
    1405     atan2d = lambda y,x: 180.*np.arctan2(y,x)/np.pi
    14061404    wave = data['wavelength']
    14071405    dist = data['distance']
     
    14091407    tilt = data['tilt']
    14101408    phi = data['rotation']
    1411     dx = x-cent[0]
    1412     dy = y-cent[1]
    1413     X = np.array(([dx,dy,0]))
    1414     X = np.sum(X*makeMat(-phi,2),axis=1)
    1415     X = np.sum(X*makeMat(-tilt,0),axis=1)
    1416     tth = atand(np.sqrt(dx**2+dy**2-X[2]**2)/(dist-X[2]))
    1417     dsp = wave/(2.*sind(tth/2.))
    1418     azm = atan2d(dy,dx)   
    1419     return tth,dsp,azm
     1409    dx = np.array(x-cent[0],dtype=np.float32)
     1410    dy = np.array(y-cent[1],dtype=np.float32)
     1411    X = np.array(([dx,dy,np.zeros_like(dx)]),dtype=np.float32).T
     1412    X = np.dot(X,makeMat(phi,2))
     1413    Z = np.dot(X,makeMat(tilt,0)).T[2]
     1414    tth = npatand(np.sqrt(dx**2+dy**2-Z**2)/(dist-Z))
     1415    dsp = wave/(2.*npsind(tth/2.))
     1416    azm = npatan2d(dy,dx)
     1417    return tth,azm,dsp
    14201418   
    14211419def GetTth(x,y,data):
    14221420    return GetTthDspAzm(x,y,data)[0]
    14231421   
     1422def GetTthAzm(x,y,data):
     1423    return GetTthDspAzm(x,y,data)[0:2]
     1424   
    14241425def GetDsp(x,y,data):
    1425     return GetTthDspAzm(x,y,data)[1]
     1426    return GetTthDspAzm(x,y,data)[2]
    14261427       
    14271428def ImageCompress(image,scale):
     
    15961597        ellipse = GetEllipse(H[3],data)
    15971598        data['ellipses'].append(copy.deepcopy(ellipse+('b',)))
    1598     G2plt.PlotImage(self)
    1599        
     1599    G2plt.PlotImage(self)       
    16001600    return True
     1601   
     1602def ImageIntegrate(self,data):
     1603    print 'image integrate'
     1604    pixelSize = data['pixelSize']
     1605    scalex = pixelSize[0]/1000.
     1606    scaley = pixelSize[1]/1000.
     1607    LUtth = data['IOtth']
     1608    if data['fullIntegrate']:
     1609        LRazm = [0,360]
     1610    else:
     1611        LRazm = data['LRazimuth']
     1612    numAzms = data['outAzimuths']
     1613    numChans = data['outChannels']
     1614    outGrid = np.zeros(shape=(numAzms,numChans))
     1615    outNum = np.zeros(shape=(numAzms,numChans))           
     1616    imageN = len(self.ImageZ)
     1617    t0 = time.time()
     1618    print 'Create ',imageN,' X ',imageN,' 2-theta,azimuth map'
     1619    tax,tay = np.mgrid[0:imageN,0:imageN]
     1620    tax = np.asfarray(tax)
     1621    tay = np.asfarray(tay)
     1622    tax *= scalex
     1623    tay *= scaley
     1624    t1 = time.time()
     1625    print "Elapsed time:","%8.3f"%(t1-t0), "s"
     1626    print 'Fill map with 2-theta/azimuth values'
     1627    self.TA = np.reshape(GetTthAzm(tay,tax,data),(2,imageN,imageN))
     1628    t2 = time.time()
     1629    print "Elapsed time:","%8.3f"%(t2-t1), "s"
     1630    G2plt.PlotTRImage(self)
     1631    print 'Form 1-D histograms for ',numAzms,' azimuthal angles'
     1632    print 'Integration limits:',LUtth,LRazm
     1633    NST = np.histogram2d(self.TA[1].flatten(),self.TA[0].flatten(), \
     1634        bins=(numChans,numAzms),range=[LUtth,LRazm])
     1635    HST = np.histogram2d(self.TA[1].flatten(),self.TA[0].flatten(),normed=True, \
     1636        bins=(numChans,numAzms),weights=self.ImageZ.flatten(),range=[LUtth,LRazm])
     1637    t3 = time.time()
     1638    print "Elapsed time:","%8.3f"%(t3-t2), "s"
     1639    print NST[0]
     1640    print HST[0]
     1641    print HST[1]
     1642    print HST[2]
     1643   
    16011644       
    16021645def test():
  • trunk/GSASIIgrid.py

    r48 r49  
    2020] = [wx.NewId() for _init_coll_Atom_Items in range(2)]
    2121
    22 [ wxID_IMCALIBRATE, wxID_IMINTEGRATE, wxID_IMCLEARCALIB,
    23 ] = [wx.NewId() for _init_coll_IMAGE_Items in range(3)]
     22[ wxID_IMCALIBRATE, wxID_IMINTEGRATE, wxID_IMCLEARCALIB, wxID_IMREFRESHTA,
     23] = [wx.NewId() for _init_coll_IMAGE_Items in range(4)]
    2424
    2525[ wxID_UNDO,wxID_PEAKFIT,wxID_AUTOPEAKFIT,
     
    5454        parent.Append(help='',id=wxID_IMCLEARCALIB, kind=wx.ITEM_NORMAL,text='Clear calibration')
    5555        parent.Append(help='',id=wxID_IMINTEGRATE, kind=wx.ITEM_NORMAL,text='Integrate')
     56        parent.Append(help='',id=wxID_IMREFRESHTA, kind=wx.ITEM_NORMAL,text='Refresh transformed image')
     57       
    5658           
    5759    def _init_coll_Peak_Items(self,parent):
     
    11331135        try:
    11341136            numChans = int(outChan.GetValue())
     1137            if numChans < 1:
     1138                raise ValueError
    11351139            data['outChannels'] = numChans
    11361140        except ValueError:
     
    11381142        outChan.SetValue(str(data['outChannels']))          #reset in case of error       
    11391143       
     1144    def OnNumOutAzms(event):
     1145        try:
     1146            numAzms = int(outAzim.GetValue())
     1147            if numAzms < 1:
     1148                raise ValueError
     1149            data['outAzimuths'] = numAzms           
     1150        except ValueError:
     1151            pass
     1152        outAzim.SetValue(str(data['outAzimuths']))          #reset in case of error       
     1153       
    11401154    def OnWavelength(event):
    11411155        try:
    11421156            wave = float(waveSel.GetValue())
     1157            if wave < .01:
     1158                raise ValueError
    11431159            data['wavelength'] = wave
    11441160        except ValueError:
     
    11941210        Lazm = int(self.Lazim.GetValue())
    11951211        Razm = int(self.Razim.GetValue())
    1196 #        if Lazm > Razm:
    1197 #            G2cmp.SwapXY(Lazm,Razm)
    11981212        data['LRazimuth'] = [Lazm,Razm]
    11991213        G2plt.PlotImage(self)
     
    12371251                   
    12381252    def OnIntegrate(event):
    1239         print 'image integrate'
     1253        G2cmp.ImageIntegrate(self,data)
     1254       
     1255    def OnRefreshTA(event):
     1256        G2plt.PlotTRImage(self)       
    12401257       
    12411258    colorList = [m for m in mpl.cm.datad.keys() if not m.endswith("_r")]
     
    12481265    self.dataFrame.Bind(wx.EVT_MENU, OnClearCalib, id=wxID_IMCLEARCALIB)   
    12491266    self.dataFrame.Bind(wx.EVT_MENU, OnIntegrate, id=wxID_IMINTEGRATE)       
     1267    self.dataFrame.Bind(wx.EVT_MENU, OnRefreshTA, id=wxID_IMREFRESHTA)       
    12501268    self.dataDisplay = wx.Panel(self.dataFrame)
    12511269    mainSizer = wx.BoxSizer(wx.VERTICAL)
     
    12841302    comboSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Pixel search range '),0,
    12851303        wx.ALIGN_CENTER_VERTICAL)
    1286     pixLimit = wx.ComboBox(parent=self.dataDisplay,value=str(data['pixLimit']),choices=['5','10','15','20'],
     1304    pixLimit = wx.ComboBox(parent=self.dataDisplay,value=str(data['pixLimit']),choices=['1','2','5','10','15','20'],
    12871305        style=wx.CB_READONLY|wx.CB_DROPDOWN)
    12881306    pixLimit.Bind(wx.EVT_COMBOBOX, OnPixLimit)
     
    13141332    dataSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Inner/Outer 2-theta'),0,
    13151333        wx.ALIGN_CENTER_VERTICAL)
    1316     if 'IOtth' not in data:                 #temporary fix
     1334       
     1335    #temporary fixes   
     1336    if 'IOtth' not in data:                 
    13171337        del data['IOradii']
    13181338        data['IOtth'] = [2.0,5.0]
     1339    if 'outAzimuths' not in data:
     1340        data['outAzimuths'] = 1       
     1341       
    13191342    IOtth = data['IOtth']
    13201343    littleSizer = wx.BoxSizer(wx.HORIZONTAL)
     
    13551378    dataSizer.Add(distSel,0,wx.ALIGN_CENTER_VERTICAL)
    13561379
    1357     dataSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' No. bins'),0,
     1380    dataSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' No. 2-theta/azimuth bins'),0,
    13581381        wx.ALIGN_CENTER_VERTICAL)
     1382    littleSizer = wx.BoxSizer(wx.HORIZONTAL)
    13591383    outChan = wx.TextCtrl(parent=self.dataDisplay,value=str(data['outChannels']),style=wx.TE_PROCESS_ENTER)
    13601384    outChan.Bind(wx.EVT_TEXT_ENTER,OnNumOutChans)
    1361     dataSizer.Add(outChan,0,wx.ALIGN_CENTER_VERTICAL)
     1385    littleSizer.Add(outChan,0,wx.ALIGN_CENTER_VERTICAL)
     1386    outAzim = wx.TextCtrl(parent=self.dataDisplay,value=str(data['outAzimuths']),style=wx.TE_PROCESS_ENTER)
     1387    outAzim.Bind(wx.EVT_TEXT_ENTER,OnNumOutAzms)
     1388    littleSizer.Add(outAzim,0,wx.ALIGN_CENTER_VERTICAL)
     1389    dataSizer.Add(littleSizer,0,)
    13621390
    13631391    dataSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Tilt angle'),0,
     
    18021830        elif 'PKS' in self.PatternTree.GetItemText(item):
    18031831            G2plt.PlotPowderLines(self)
    1804         elif 'PWDR' in self.PatternTree.GetItemText(item):
    1805             G2plt.PlotPatterns(self)
     1832        elif 'PWDR' in self.PatternTree.GetItemText(item):           
     1833            G2plt.PlotPatterns(self,True)
    18061834        elif 'SXTL' in self.PatternTree.GetItemText(item):
    18071835            self.Sngl = item
  • trunk/GSASIIplot.py

    r48 r49  
    3838    def __init__(self,parent,id=-1):
    3939        wx.Panel.__init__(self,parent,id=id)
    40         self.nb = wx.aui.AuiNotebook(self) #style=wx.AUI_NB_DEFAULT_STYLE ^ wx.AUI_NB_CLOSE_ON_ACTIVE_TAB)
     40        #so one can't delete a plot page!!
     41        self.nb = wx.aui.AuiNotebook(self, \
     42            style=wx.aui.AUI_NB_DEFAULT_STYLE ^ wx.aui.AUI_NB_CLOSE_ON_ACTIVE_TAB)
    4143        sizer = wx.BoxSizer()
    4244        sizer.Add(self.nb,1,wx.EXPAND)
     
    198200                if (0 <= xpix <= size) and (0 <= ypix <= size):
    199201                    imgPage.canvas.SetToolTipString('%6d'%(self.ImageZ[ypix][xpix]))
    200                 tth,dsp,azm = G2cmp.GetTthDspAzm(xpos,ypos,Data)
     202                tth,azm,dsp = G2cmp.GetTthDspAzm(xpos,ypos,Data)
    201203                Q = 2.*math.pi/dsp
    202204                self.G2plotNB.status.SetFields(\
     
    257259                            rings.remove(ring)                                                                       
    258260                else:
    259                     tth,dsp,azm = G2cmp.GetTthDspAzm(xpos,ypos,Data)
     261                    tth,azm,dsp = G2cmp.GetTthDspAzm(xpos,ypos,Data)
    260262                    if 'Line2D' in str(self.itemPicked):
    261263                        if 'line1' in str(self.itemPicked):
     
    326328    imgPlot.set_ylabel('Image y-axis, mm',fontsize=12)
    327329    A = G2cmp.ImageCompress(self.ImageZ,imScale)
    328     self.Img = imgPlot.imshow(self.ImageZ[::imScale,::imScale], \
    329         aspect='equal',cmap=acolor, \
    330         interpolation='nearest',vmin=Imin,vmax=Imax, \
    331         extent=[0,Xmax,Xmax,0])
     330    self.Img = imgPlot.imshow(A,aspect='equal',cmap=acolor, \
     331        interpolation='nearest',vmin=Imin,vmax=Imax,extent=[0,Xmax,Xmax,0])
    332332    imgPlot.plot(xcent,ycent,'x')
    333333    if Data['showLines']:
     
    461461    pkwPage.canvas.draw()
    462462
    463 def PlotPatterns(self):
     463def PlotPatterns(self,newPlot=False):
    464464   
    465465    def OnPick(event):
     
    471471        xpos = pick.get_xdata()
    472472        ypos = pick.get_ydata()
     473        ind = event.ind
    473474        view = pdrPage.toolbar._views.forward()
    474         ind0 = np.searchsorted(xye[0],view[0][0])
    475         ind = event.ind+ind0
     475        if view and 'line2' in str(pick):           #apply offset only for picked powder pattern points
     476            ind += np.searchsorted(xye[0],view[0][0])
    476477        xy = zip(xpos[ind],ypos[ind])[0]
    477         xm = mouse.xdata
    478478        if self.PatternTree.GetItemText(PickId) == 'Peak List':
    479479            if ind.all() != [0]:                                    #picked a data point
     
    489489                data.append(XY)
    490490                G2gd.UpdatePeakGrid(self,data)
     491                PlotPatterns(self)
    491492            else:                                                   #picked a peak list line
    492493                self.itemPicked = pick
     
    501502                self.PatternTree.SetItemPyData(LimitId,data)
    502503                G2gd.UpdateLimitsGrid(self,data)
     504                PlotPatterns(self)
    503505            else:                                                   #picked a limit line
    504506                self.itemPicked = pick               
    505         PlotPatterns(self)
    506507       
    507508    def OnPlotKeyPress(event):
     
    511512            else:
    512513                self.Weight = True
    513             self.PlotPatterns()
    514514            print 'plot weighting:',self.Weight
    515         if self.PatternTree.GetChildrenCount(self.root,False) > 1:
    516             if event.key == 'u' and self.Offset < 100.:
    517                 self.Offset += 1.
    518                 self.PlotPatterns()
    519             elif event.key == 'd' and self.Offset > 0.:
    520                 self.Offset -= 1.
    521                 self.PlotPatterns()
    522             elif event.key == 'c':
    523                 print 'contouring'
    524                 if self.Contour:
    525                     self.Contour = False
    526                 else:
    527                     self.Contour = True
    528             PlotPatterns(self)
     515        elif event.key == 'u' and self.Offset < 100.:
     516            self.Offset += 1.
     517        elif event.key == 'd' and self.Offset > 0.:
     518            self.Offset -= 1.
     519        elif event.key == 'c':
     520            print 'contouring'
     521            if self.Contour:
     522                self.Contour = False
     523            else:
     524                self.Contour = True
    529525        else:
    530             event.Skip()
     526            event.Skip(True)
     527        PlotPatterns(self)
    531528                       
    532529    def OnMotion(event):
     
    534531        if xpos:                                        #avoid out of frame mouse position
    535532            ypos = event.ydata
     533            wave = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Instrument Parameters'))[0][1]
     534            dsp = 0.0
     535            if abs(xpos) > 0.:
     536                dsp = wave/(2.*sind(abs(xpos)/2.0))
    536537            pdrPage.canvas.SetCursor(wx.CROSS_CURSOR)
    537             self.G2plotNB.status.SetFields(['2-theta =%9.3f Intensity =%9.1f'%(xpos,ypos),])
     538            self.G2plotNB.status.SetFields(['2-theta =%9.3f d =%9.5f Intensity =%9.1f'%(xpos,dsp,ypos),])
    538539            if self.itemPicked:
    539540                pdrPage.canvas.SetToolTipString('%9.3f'%(xpos))
     
    549550                LimitId = G2gd.GetPatternTreeItemId(self,self.PatternId, 'Limits')
    550551                data = self.PatternTree.GetItemPyData(LimitId)
     552                print 'limits',xpos
    551553                data[1][lineNo] = xpos
    552554                self.PatternTree.SetItemPyData(LimitId,data)
     
    556558                PeakId = G2gd.GetPatternTreeItemId(self,self.PatternId, 'Peak List')
    557559                data = self.PatternTree.GetItemPyData(PeakId)
     560                print 'peaks',xpos
    558561                data[lineNo-2][0] = xpos
    559562                self.PatternTree.SetItemPyData(PeakId,data)
     
    562565        self.itemPicked = None   
    563566
     567    xylim = []
    564568    try:
    565569        plotNum = self.G2plotNB.plotList.index('Powder Patterns')
    566570        pdrPage = self.G2plotNB.nb.GetPage(plotNum)
     571        if not newPlot:
     572            pdrPlot = pdrPage.figure.gca()          #get previous powder plot & get limits
     573            xylim = pdrPlot.get_xlim(),pdrPlot.get_ylim()
    567574        pdrPage.figure.clf()
    568         pdrPlot = pdrPage.figure.gca()
    569         pdrPage.toolbar._views = copy.deepcopy(pdrPage.views)
     575        pdrPlot = pdrPage.figure.gca()          #get a fresh plot after clf()
    570576    except ValueError,error:
     577        newPlot = True
    571578        pdrPlot = self.G2plotNB.add('Powder Patterns').gca()
    572579        plotNum = self.G2plotNB.plotList.index('Powder Patterns')
     
    576583        pdrPage.canvas.mpl_connect('pick_event', OnPick)
    577584        pdrPage.canvas.mpl_connect('button_release_event', OnRelease)
    578         pdrPage.xylim = 0
    579585       
    580586    pdrPage.SetFocus()
     
    583589    PatternId = self.PatternId
    584590    colors=['b','g','r','c','m','k']
    585     Ymax = 1.0
    586591    PlotList = []
    587592    Lines = []
     
    593598            PlotList.append(Pattern)
    594599        item, cookie = self.PatternTree.GetNextChild(self.root, cookie)               
    595     xlim = [0.,180.]
    596     xmin = 0.
    597     xmax = 180.
    598     ylim = [0.,1.0e12]
     600    Ymax = 1.0
    599601    for Pattern in PlotList:
    600602        xye = Pattern[1]
    601         if pdrPage.xylim:
    602             xlim,ylim = pdrPage.xylim
    603         else:       
    604             xlim = [xye[0][np.argmin(xye[0])],xye[0][np.argmax(xye[0])]]
    605             ylim = [xye[1][np.argmin(xye[1])],xye[1][np.argmax(xye[1])]]
    606603        Ymax = max(Ymax,max(xye[1]))
    607604    offset = self.Offset*Ymax/100.0
     
    621618            LimitId = G2gd.GetPatternTreeItemId(self,PatternId, 'Limits')
    622619        N = PlotList.index(Pattern)
    623         X,Y = xye[0:2]
    624         Y += offset*N
     620        X = xye[0]
     621        Y = xye[1]+offset*N
    625622        if LimitId:
    626623            limits = self.PatternTree.GetItemPyData(LimitId)
    627             Lines.append(pdrPlot.axvline(limits[1][0],color='g',dashes=(5,5),picker=3))   
    628             Lines.append(pdrPlot.axvline(limits[1][1],color='r',dashes=(5,5),picker=3))                   
     624            Lines.append(pdrPlot.axvline(limits[1][0],color='g',dashes=(5,5),picker=3.))   
     625            Lines.append(pdrPlot.axvline(limits[1][1],color='r',dashes=(5,5),picker=3.))                   
    629626        if self.Contour:
    630627            ContourY.append(N)
     
    641638                    W2 = np.sqrt(xye[2])
    642639                    D *= W2
    643                 pdrPlot.plot(X,Y,colors[N%6]+'+',picker=3)
     640                pdrPlot.plot(X,Y,colors[N%6]+'+',picker=3.,clip_on=False)
    644641                pdrPlot.plot(X,Z,colors[(N+1)%6],picker=False)
    645642                pdrPlot.plot(X,W,colors[(N+2)%6],picker=False)
     
    652649                    data = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Peak List'))
    653650                    for item in data:
    654                         Lines.append(pdrPlot.axvline(item[0],color=colors[N%6],picker=2))
     651                        Lines.append(pdrPlot.axvline(item[0],color=colors[N%6],picker=2.))
    655652                if self.PatternTree.GetItemText(PickId) == 'Limits':
    656653                    tip = 'On data point: Lower limit - L MB; Upper limit - R MB. On limit: MB down to move'
     
    658655                    data = self.LimitsTable.GetData()
    659656            else:
    660                 pdrPlot.plot(xye[0],Y,colors[N%6],picker=False)
     657                pdrPlot.plot(X,Y,colors[N%6],picker=False)
    661658    if PickId and self.PatternTree.GetItemText(PickId) in ['Index Peak List','Unit Cells List']:
    662659        peaks = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Index Peak List'))
     
    666663            pdrPlot.axvline(hkl[5],color='r',dashes=(5,5))
    667664    if self.Contour:
    668         pdrPlot.contourf(ContourX,ContourY,ContourZ)
    669         pdrPlot.set_ylim(0,Nseq-1)
    670     self.Lines = Lines
    671     view = pdrPage.toolbar._views.forward()
    672     if view:
    673         pdrPlot.set_xlim(view[0][:2])
    674         pdrPlot.set_ylim(view[0][2:])
     665        acolor = mpl.cm.get_cmap('Paired')
     666        pdrPlot.contourf(ContourX,ContourY,ContourZ,cmap=acolor)
     667#        pdrPlot.set_ylim(0,Nseq-1)
     668    else:
     669        self.Lines = Lines
     670    if not newPlot:
     671        pdrPage.toolbar.push_current()
     672        pdrPlot.set_xlim(xylim[0])
     673        pdrPlot.set_ylim(xylim[1])
     674        xylim = []
     675        pdrPage.toolbar.push_current()
     676        pdrPage.toolbar.draw()
     677    else:
     678        pdrPage.canvas.draw()
     679
     680   
    675681    self.Pwdr = True
    676     pdrPage.canvas.draw()
    677682
    678683def PlotPowderLines(self):
     
    712717    pksPlot.set_xlim(xlim)
    713718    pksPage.canvas.draw()
    714    
     719
     720
     721def PlotTRImage(self):
     722           
     723    def OnMotion(event):
     724        trimgPage.canvas.SetToolTipString('')
     725        trimgPage.canvas.SetCursor(wx.CROSS_CURSOR)
     726        azm = event.xdata
     727        tth = event.ydata
     728        if azm and tth:
     729            self.G2plotNB.status.SetFields(\
     730                ['Detector 2-th =%9.2fdeg, azm = %7.2fdeg'%(tth,azm),])
     731                   
     732    def OnPick(event):
     733        if self.PatternTree.GetItemText(self.PickId) != 'Image Controls':
     734            return
     735        if self.itemPicked is not None: return
     736        pick = event.artist
     737        self.itemPicked = pick
     738       
     739    def OnRelease(event):
     740        if self.PatternTree.GetItemText(self.PickId) != 'Image Controls':
     741            return
     742        Data = self.PatternTree.GetItemPyData(self.PickId)
     743        if self.itemPicked:
     744            xpos = event.xdata
     745            if xpos:                                        #avoid out of frame mouse position
     746                ypos = event.ydata
     747                if 'Line2D' in str(self.itemPicked):
     748                    if 'line0' in str(self.itemPicked):
     749                        Data['IOtth'][0] = ypos
     750                    elif 'line1' in str(self.itemPicked):
     751                        Data['IOtth'][1] = ypos
     752                    elif 'line2' in str(self.itemPicked) and not Data['fullIntegrate']:
     753                        Data['LRazimuth'][0] = int(xpos)
     754                    elif 'line3' in str(self.itemPicked) and not Data['fullIntegrate']:
     755                        Data['LRazimuth'][1] = int(xpos)
     756                       
     757                    if Data['LRazimuth'][1] < Data['LRazimuth'][0]:
     758                        Data['LRazimuth'][1] += 360
     759                    if  Data['IOtth'][0] > Data['IOtth'][1]:
     760                        Data['IOtth'] = G2cmp.SwapXY(Data['IOtth'][0],Data['IOtth'][1])
     761                       
     762                    self.InnerTth.SetValue("%8.2f" % (Data['IOtth'][0]))
     763                    self.OuterTth.SetValue("%8.2f" % (Data['IOtth'][1]))
     764                    self.Lazim.SetValue("%6d" % (Data['LRazimuth'][0]))
     765                    self.Razim.SetValue("%6d" % (Data['LRazimuth'][1]))
     766                else:
     767                    print event.xdata,event.ydata,event.button
     768                PlotTRImage(self)
     769            self.itemPicked = None
     770           
     771    try:
     772        plotNum = self.G2plotNB.plotList.index('2D Transformed Powder Image')
     773        trimgPage = self.G2plotNB.nb.GetPage(plotNum)
     774        trimgPage.figure.clf()
     775        trimgPlot = trimgPage.figure.gca()
     776        if trimgPage.views:
     777            trimgPage.toolbar._views = copy.deepcopy(trimgPage.views)
     778        view = trimgPage.toolbar._views.forward()
     779       
     780    except ValueError,error:
     781        trimgPlot = self.G2plotNB.add('2D Transformed Powder Image').gca()
     782        plotNum = self.G2plotNB.plotList.index('2D Transformed Powder Image')
     783        trimgPage = self.G2plotNB.nb.GetPage(plotNum)
     784        trimgPage.canvas.mpl_connect('motion_notify_event', OnMotion)
     785        trimgPage.canvas.mpl_connect('pick_event', OnPick)
     786        trimgPage.canvas.mpl_connect('button_release_event', OnRelease)
     787        trimgPage.views = False
     788        view = False
     789    trimgPage.SetFocus()
     790       
     791    data = self.PatternTree.GetItemPyData(self.PickId)
     792    image = self.ImageZ
     793    Iz = len(image)
     794    Imin,Imax = data['range'][1]
     795    step = (Imax-Imin)/5.
     796    V = np.arange(Imin,Imax,step)
     797    acolor = mpl.cm.get_cmap('Paired')
     798    trimgPlot.set_xlabel('azimuth',fontsize=12)
     799    trimgPlot.set_ylabel('2-theta',fontsize=12)
     800    trimgPlot.contour(self.TA[1],self.TA[0],image,V,cmap=acolor)
     801    if data['showLines']:
     802        IOtth = data['IOtth']
     803        LRAzim = data['LRazimuth']                  #NB: integers
     804        trimgPlot.plot([LRAzim[0],LRAzim[1]],[IOtth[0],IOtth[0]],picker=True)
     805        trimgPlot.plot([LRAzim[0],LRAzim[1]],[IOtth[1],IOtth[1]],picker=True)
     806        trimgPlot.plot([LRAzim[0],LRAzim[0]],[IOtth[0],IOtth[1]],picker=True)
     807        trimgPlot.plot([LRAzim[1],LRAzim[1]],[IOtth[0],IOtth[1]],picker=True)
     808    trimgPage.canvas.draw()
     809           
     810 
Note: See TracChangeset for help on using the changeset viewer.