Changeset 51


Ignore:
Timestamp:
Apr 22, 2010 3:17:01 PM (12 years ago)
Author:
vondreel
Message:

integration working & plotted

Location:
trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/GSASII.py

    r50 r51  
    237237        self.Img = 0
    238238        self.TA = 0
     239        self.Integrate = 0
    239240        self.Pwdr = False
    240241        self.imageDefault = {}
  • trunk/GSASIIcomp.py

    r50 r51  
    5656    return '%d:%2d:%.2f'%(H,M,S)
    5757
    58 #def valueEsd(value,esd,precision):
    59 #    nDecimals = lambda esd: max(0.,1.545-math.log10(abs(esd)))
    60 #    if esd:
    61 #    else:
    62 #       
    63 #       
     58def ValEsd(value,esd=0,nTZ=False):
     59    # returns value(esd) string; nTZ=True for no trailing zeros
     60    # use esd < 0 for level of precision shown e.g. esd=-0.01 gives 2 places beyond decimal
     61    #get the 2 significant digits in the esd
     62    edig = lambda esd: int(round(10**(math.log10(esd) % 1+1)))
     63    #get the number of digits to represent them
     64    epl = lambda esd: 2+int(1.545-math.log10(10*edig(esd)))
     65   
     66    mdec = lambda esd: -int(math.log10(abs(esd)))
     67    ndec = lambda esd: int(1.545-math.log10(abs(esd)))
     68    if esd > 0:
     69        fmt = '"%.'+str(ndec(esd))+'f(%d)"'
     70        print fmt,ndec(esd),esd*10**(mdec(esd)+1)
     71        return fmt%(value,int(esd*10**(mdec(esd)+1)))
     72    elif esd < 0:
     73         return str(round(value,mdec(esd)))
     74    else:
     75        text = "%F"%(value)
     76        if nTZ:
     77            return text.rstrip('0')
     78        else:
     79            return text
     80
     81       
     82       
    6483
    6584def DoPeakFit(peaks,background,limits,inst,data):
     
    16071626    LUtth = data['IOtth']
    16081627    if data['fullIntegrate']:
    1609         LRazm = [0,360]
     1628        LRazm = [-180,180]
    16101629    else:
    16111630        LRazm = data['LRazimuth']
     
    16251644    print "Elapsed time:","%8.3f"%(t1-t0), "s"
    16261645    print 'Fill map with 2-theta/azimuth values'
    1627     self.TA = np.reshape(GetTthAzm(tay,tax,data),(2,imageN,imageN))
     1646    self.TA = GetTthAzm(tay,tax,data)           #2-theta & azimuth arrays
     1647    self.TA = np.reshape(self.TA,(2,imageN,imageN))
     1648    self.TA = np.dstack((self.TA[1],self.TA[0],self.ImageZ))    #azimuth, 2-theta, intensity order
    16281649    t2 = time.time()
    16291650    print "Elapsed time:","%8.3f"%(t2-t1), "s"
     
    16311652    print 'Form 1-D histograms for ',numAzms,' azimuthal angles'
    16321653    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])
     1654    tax,tay,taz = np.dsplit(self.TA,3)    #azimuth, 2-theta, intensity
     1655    NST = np.histogram2d(tax.flatten(),tay.flatten(),normed=False, \
     1656        bins=(numAzms,numChans),range=[LRazm,LUtth])
     1657    HST = np.histogram2d(tax.flatten(),tay.flatten(),normed=False, \
     1658        bins=(numAzms,numChans),weights=taz.flatten(),range=[LRazm,LUtth])
    16371659    t3 = time.time()
    16381660    print "Elapsed time:","%8.3f"%(t3-t2), "s"
    1639     print NST[0]
    1640     print HST[0]
    1641     print HST[1]
    1642     print HST[2]
     1661    self.Integrate = [HST[0]/NST[0],HST[1],HST[2]]
     1662    G2plt.PlotIntegration(self,newPlot=True)
    16431663   
    16441664       
  • trunk/GSASIIgrid.py

    r50 r51  
    2020] = [wx.NewId() for _init_coll_Atom_Items in range(2)]
    2121
    22 [ wxID_IMCALIBRATE, wxID_IMINTEGRATE, wxID_IMCLEARCALIB, wxID_IMREFRESHTA,
    23 ] = [wx.NewId() for _init_coll_IMAGE_Items in range(4)]
     22[ wxID_IMCALIBRATE, wxID_IMINTEGRATE, wxID_IMCLEARCALIB,
     23] = [wx.NewId() for _init_coll_IMAGE_Items in range(3)]
    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')
    5756       
    5857           
     
    11121111    def OnNewColorBar(event):
    11131112        data['color'] = colSel.GetValue()
    1114         G2plt.PlotImage(self)
     1113        G2plt.PlotExposedImage(self)
    11151114       
    11161115    def OnNewCalibrant(event):
     
    11241123        delt = data['range'][0][1]-data['range'][0][0]
    11251124        data['range'][1][1] = int((imax/100.)*delt)+data['range'][0][0]
    1126         G2plt.PlotImage(self)
     1125        G2plt.PlotExposedImage(self)
    11271126       
    11281127    def OnMinSlider(event):
     
    11301129        delt = data['range'][1][1]-data['range'][0][0]
    11311130        data['range'][1][0] = int((imin/100.)*delt)+data['range'][0][0]
    1132         G2plt.PlotImage(self)
     1131        G2plt.PlotExposedImage(self)
    11331132       
    11341133    def OnNumOutChans(event):
     
    11751174        else:
    11761175            data['showLines'] = True
    1177         G2plt.PlotImage(self)
     1176        G2plt.PlotExposedImage(self)
    11781177       
    11791178    def OnFullIntegrate(event):
     
    11861185            self.Lazim.SetEditable(False)           
    11871186            self.Razim.SetEditable(False)           
    1188         G2plt.PlotImage(self)
     1187        G2plt.PlotExposedImage(self)
    11891188       
    11901189    def OnSetDefault(event):
     
    12051204        self.InnerTth.SetValue("%8.2f" % (Ltth))
    12061205        self.OuterTth.SetValue("%8.2f" % (Utth))
    1207         G2plt.PlotImage(self)
     1206        G2plt.PlotExposedImage(self)
    12081207       
    12091208    def OnLRazim(event):
     
    12111210        Razm = int(self.Razim.GetValue())
    12121211        data['LRazimuth'] = [Lazm,Razm]
    1213         G2plt.PlotImage(self)
     1212        G2plt.PlotExposedImage(self)
    12141213           
    12151214    def OnSetRings(event):
     
    12531252        G2cmp.ImageIntegrate(self,data)
    12541253       
    1255     def OnRefreshTA(event):
    1256         G2plt.PlotTRImage(self)       
    1257        
    12581254    colorList = [m for m in mpl.cm.datad.keys() if not m.endswith("_r")]
    12591255    calList = [m for m in calFile.Calibrants.keys()]
     
    12651261    self.dataFrame.Bind(wx.EVT_MENU, OnClearCalib, id=wxID_IMCLEARCALIB)   
    12661262    self.dataFrame.Bind(wx.EVT_MENU, OnIntegrate, id=wxID_IMINTEGRATE)       
    1267     self.dataFrame.Bind(wx.EVT_MENU, OnRefreshTA, id=wxID_IMREFRESHTA)       
    12681263    self.dataDisplay = wx.Panel(self.dataFrame)
    12691264    mainSizer = wx.BoxSizer(wx.VERTICAL)
  • trunk/GSASIIplot.py

    r50 r51  
    7171            elif '001' in Data['Zone']:
    7272                HKLtxt = '(%3d,%3d,%3d)'%(xpos,ypos,zpos)
    73             snglPage.canvas.SetToolTipString(HKLtxt)
     73            Page.canvas.SetToolTipString(HKLtxt)
    7474            self.G2plotNB.status.SetFields(['HKL = '+HKLtxt,])
    7575               
     
    7878        pos = event.artist.center
    7979        if '100' in Data['Zone']:
    80             snglPage.canvas.SetToolTipString('(picked:(%3d,%3d,%3d))'%(zpos,pos[0],pos[1]))
     80            Page.canvas.SetToolTipString('(picked:(%3d,%3d,%3d))'%(zpos,pos[0],pos[1]))
    8181            hkl = [zpos,pos[0],pos[1]]
    8282        elif '010' in Data['Zone']:
    83             snglPage.canvas.SetToolTipString('(picked:(%3d,%3d,%3d))'%(pos[0],zpos,pos[1]))
     83            Page.canvas.SetToolTipString('(picked:(%3d,%3d,%3d))'%(pos[0],zpos,pos[1]))
    8484            hkl = [pos[0],zpos,pos[1]]
    8585        elif '001' in Data['Zone']:
    86             snglPage.canvas.SetToolTipString('(picked:(%3d,%3d,%3d))'%(pos[0],pos[1],zpos))
     86            Page.canvas.SetToolTipString('(picked:(%3d,%3d,%3d))'%(pos[0],pos[1],zpos))
    8787            hkl = [pos[0],pos[1],zpos]
    8888        h,k,l = hkl
     
    9898    try:
    9999        plotNum = self.G2plotNB.plotList.index('Structure Factors')
    100         snglPage = self.G2plotNB.nb.GetPage(plotNum)
     100        Page = self.G2plotNB.nb.GetPage(plotNum)
    101101        if not newPlot:
    102             snglPlot = snglPage.figure.gca()          #get previous powder plot & get limits
    103             xylim = snglPlot.get_xlim(),snglPlot.get_ylim()
    104         snglPage.figure.clf()
    105         snglPlot = snglPage.figure.gca()          #get a fresh plot after clf()
     102            Plot = Page.figure.gca()          #get previous powder plot & get limits
     103            xylim = Plot.get_xlim(),Plot.get_ylim()
     104        Page.figure.clf()
     105        Plot = Page.figure.gca()          #get a fresh plot after clf()
    106106    except ValueError,error:
    107         snglPlot = self.G2plotNB.add('Structure Factors').gca()
     107        Plot = self.G2plotNB.add('Structure Factors').gca()
    108108        plotNum = self.G2plotNB.plotList.index('Structure Factors')
    109         snglPage = self.G2plotNB.nb.GetPage(plotNum)
    110         snglPage.canvas.mpl_connect('key_press_event', OnSCKeyPress)
    111         snglPage.canvas.mpl_connect('pick_event', OnSCPick)
    112         snglPage.canvas.mpl_connect('motion_notify_event', OnSCMotion)
    113     snglPage.SetFocus()
     109        Page = self.G2plotNB.nb.GetPage(plotNum)
     110        Page.canvas.mpl_connect('key_press_event', OnSCKeyPress)
     111        Page.canvas.mpl_connect('pick_event', OnSCPick)
     112        Page.canvas.mpl_connect('motion_notify_event', OnSCMotion)
     113    Page.SetFocus()
    114114   
    115     snglPlot.set_aspect(aspect='equal')
     115    Plot.set_aspect(aspect='equal')
    116116    HKLref = self.PatternTree.GetItemPyData(self.Sngl)
    117117    Data = self.PatternTree.GetItemPyData( \
     
    129129    pzone = [[1,2],[0,2],[0,1]]
    130130    izone = zones.index(Data['Zone'])
    131     snglPlot.set_title(self.PatternTree.GetItemText(self.Sngl)[5:])
     131    Plot.set_title(self.PatternTree.GetItemText(self.Sngl)[5:])
    132132    HKL = []
    133133    for H,Fosq,sig,Fcsq,x,x,x in HKLref:
     
    153153            xy = (H[pzone[izone][0]],H[pzone[izone][1]])
    154154            if A > 0.0:
    155                 snglPlot.add_artist(Circle(xy,radius=A,ec='g',fc='w',picker=3))
     155                Plot.add_artist(Circle(xy,radius=A,ec='g',fc='w',picker=3))
    156156            if B:
    157                 snglPlot.add_artist(Circle(xy,radius=B,ec='b',fc='w'))
     157                Plot.add_artist(Circle(xy,radius=B,ec='b',fc='w'))
    158158                radius = C
    159159                if radius > 0:
    160160                    if A > B:
    161                         snglPlot.add_artist(Circle(xy,radius=radius,ec='r',fc='r'))
     161                        Plot.add_artist(Circle(xy,radius=radius,ec='r',fc='r'))
    162162                    else:                   
    163                         snglPlot.add_artist(Circle(xy,radius=radius,ec='g',fc='g'))
     163                        Plot.add_artist(Circle(xy,radius=radius,ec='g',fc='g'))
    164164    HKL = np.array(HKL)
    165     snglPlot.set_xlabel(xlabel[izone]+str(Data['Layer']),fontsize=12)
    166     snglPlot.set_ylabel(ylabel[izone],fontsize=12)
    167     snglPlot.set_xlim((HKLmin[pzone[izone][0]],HKLmax[pzone[izone][0]]))
    168     snglPlot.set_ylim((HKLmin[pzone[izone][1]],HKLmax[pzone[izone][1]]))
     165    Plot.set_xlabel(xlabel[izone]+str(Data['Layer']),fontsize=12)
     166    Plot.set_ylabel(ylabel[izone],fontsize=12)
     167    Plot.set_xlim((HKLmin[pzone[izone][0]],HKLmax[pzone[izone][0]]))
     168    Plot.set_ylim((HKLmin[pzone[izone][1]],HKLmax[pzone[izone][1]]))
    169169    if not newPlot:
    170         snglPage.toolbar.push_current()
    171         snglPlot.set_xlim(xylim[0])
    172         snglPlot.set_ylim(xylim[1])
     170        Page.toolbar.push_current()
     171        Plot.set_xlim(xylim[0])
     172        Plot.set_ylim(xylim[1])
    173173        xylim = []
    174         snglPage.toolbar.push_current()
    175         snglPage.toolbar.draw()
     174        Page.toolbar.push_current()
     175        Page.toolbar.draw()
    176176    else:
    177         snglPage.canvas.draw()
     177        Page.canvas.draw()
    178178       
     179def PlotPatterns(self,newPlot=False):
     180   
     181    def OnPick(event):
     182        if self.itemPicked is not None: return
     183        PatternId = self.PatternId
     184        PickId = self.PickId
     185        pick = event.artist
     186        mouse = event.mouseevent
     187        xpos = pick.get_xdata()
     188        ypos = pick.get_ydata()
     189        ind = event.ind
     190        view = Page.toolbar._views.forward()
     191        if view and 'line2' in str(pick):           #apply offset only for picked powder pattern points
     192            ind += np.searchsorted(xye[0],view[0][0])
     193        xy = zip(xpos[ind],ypos[ind])[0]
     194        if self.PatternTree.GetItemText(PickId) == 'Peak List':
     195            if ind.all() != [0]:                                    #picked a data point
     196                inst = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Instrument Parameters'))
     197                if len(inst[1]) == 10:
     198                    ins = inst[1][4:10]
     199                else:
     200                    ins = inst[1][6:12]   
     201                sig = ins[0]*tand(xy[0]/2.0)**2+ins[1]*tand(xy[0]/2.0)+ins[2]
     202                gam = ins[3]/cosd(xy[0]/2.0)+ins[4]*tand(xy[0]/2.0)           
     203                data = self.PatternTree.GetItemPyData(self.PickId)
     204                XY = [xy[0],0, xy[1],1, sig,0, gam,0, ins[5],0]       #default refine intensity 1st   
     205                data.append(XY)
     206                G2gd.UpdatePeakGrid(self,data)
     207                PlotPatterns(self)
     208            else:                                                   #picked a peak list line
     209                self.itemPicked = pick
     210        elif self.PatternTree.GetItemText(PickId) == 'Limits':
     211            if ind.all() != [0]:                                    #picked a data point
     212                LimitId = G2gd.GetPatternTreeItemId(self,PatternId, 'Limits')
     213                data = self.PatternTree.GetItemPyData(LimitId)
     214                if mouse.button==1:
     215                    data[1][0] = min(xy[0],data[1][1])
     216                if mouse.button==3:
     217                    data[1][1] = max(xy[0],data[1][0])
     218                self.PatternTree.SetItemPyData(LimitId,data)
     219                G2gd.UpdateLimitsGrid(self,data)
     220                PlotPatterns(self)
     221            else:                                                   #picked a limit line
     222                self.itemPicked = pick               
     223       
     224    def OnPlotKeyPress(event):
     225        if event.key == 'w':
     226            if self.Weight:
     227                self.Weight = False
     228            else:
     229                self.Weight = True
     230            print 'plot weighting:',self.Weight
     231        elif event.key == 'u' and self.Offset < 100.:
     232            self.Offset += 1.
     233        elif event.key == 'd' and self.Offset > 0.:
     234            self.Offset -= 1.
     235        elif event.key == 'c':
     236            print 'contouring'
     237            if self.Contour:
     238                self.Contour = False
     239            else:
     240                self.Contour = True
     241        else:
     242            event.Skip(True)
     243        PlotPatterns(self)
     244                       
     245    def OnMotion(event):
     246        xpos = event.xdata
     247        if xpos:                                        #avoid out of frame mouse position
     248            ypos = event.ydata
     249            wave = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self, \
     250            PatternId, 'Instrument Parameters'))[0][1]
     251            dsp = 0.0
     252            if abs(xpos) > 0.:
     253                dsp = wave/(2.*sind(abs(xpos)/2.0))
     254            Page.canvas.SetCursor(wx.CROSS_CURSOR)
     255            self.G2plotNB.status.SetFields(['2-theta =%9.3f d =%9.5f Intensity =%9.1f'%(xpos,dsp,ypos),])
     256            if self.itemPicked:
     257                Page.canvas.SetToolTipString('%9.3f'%(xpos))
     258                   
     259    def OnRelease(event):
     260        if self.itemPicked is None: return
     261        xpos = event.xdata
     262        if xpos:                                        #avoid out of frame mouse position
     263            lines = []
     264            for line in self.Lines: lines.append(line.get_xdata()[0])
     265            lineNo = lines.index(self.itemPicked.get_xdata()[0])
     266            if  lineNo in [0,1]:
     267                LimitId = G2gd.GetPatternTreeItemId(self,self.PatternId, 'Limits')
     268                data = self.PatternTree.GetItemPyData(LimitId)
     269                print 'limits',xpos
     270                data[1][lineNo] = xpos
     271                self.PatternTree.SetItemPyData(LimitId,data)
     272                if self.PatternTree.GetItemText(self.PickId) == 'Limits':
     273                    G2gd.UpdateLimitsGrid(self,data)
     274            else:
     275                PeakId = G2gd.GetPatternTreeItemId(self,self.PatternId, 'Peak List')
     276                data = self.PatternTree.GetItemPyData(PeakId)
     277                print 'peaks',xpos
     278                data[lineNo-2][0] = xpos
     279                self.PatternTree.SetItemPyData(PeakId,data)
     280                G2gd.UpdatePeakGrid(self,data)
     281        PlotPatterns(self)
     282        self.itemPicked = None   
     283
     284    xylim = []
     285    try:
     286        plotNum = self.G2plotNB.plotList.index('Powder Patterns')
     287        Page = self.G2plotNB.nb.GetPage(plotNum)
     288        if not newPlot:
     289            Plot = Page.figure.gca()          #get previous powder plot & get limits
     290            xylim = Plot.get_xlim(),Plot.get_ylim()
     291        Page.figure.clf()
     292        Plot = Page.figure.gca()          #get a fresh plot after clf()
     293    except ValueError,error:
     294        newPlot = True
     295        Plot = self.G2plotNB.add('Powder Patterns').gca()
     296        plotNum = self.G2plotNB.plotList.index('Powder Patterns')
     297        Page = self.G2plotNB.nb.GetPage(plotNum)
     298        Page.canvas.mpl_connect('key_press_event', OnPlotKeyPress)
     299        Page.canvas.mpl_connect('motion_notify_event', OnMotion)
     300        Page.canvas.mpl_connect('pick_event', OnPick)
     301        Page.canvas.mpl_connect('button_release_event', OnRelease)
     302       
     303    Page.SetFocus()
     304
     305    PickId = self.PickId
     306    PatternId = self.PatternId
     307    colors=['b','g','r','c','m','k']
     308    PlotList = []
     309    Lines = []
     310    item, cookie = self.PatternTree.GetFirstChild(self.root)
     311    while item:
     312        if 'PWDR' in self.PatternTree.GetItemText(item):
     313            Pattern = self.PatternTree.GetItemPyData(item)
     314            Pattern.append(self.PatternTree.GetItemText(item))
     315            PlotList.append(Pattern)
     316        item, cookie = self.PatternTree.GetNextChild(self.root, cookie)               
     317    Ymax = 1.0
     318    for Pattern in PlotList:
     319        xye = Pattern[1]
     320        Ymax = max(Ymax,max(xye[1]))
     321    offset = self.Offset*Ymax/100.0
     322    Plot.set_title('Powder Patterns')
     323    Plot.set_xlabel(r'$\mathsf{2\theta}$',fontsize=14)
     324    Plot.set_ylabel('Intensity',fontsize=12)
     325    if self.Contour:
     326        ContourZ = []
     327        ContourY = []
     328        Nseq = 0
     329    for Pattern in PlotList:
     330        ifpicked = False
     331        LimitId = 0
     332        xye = Pattern[1]
     333        if PickId:
     334            ifpicked = Pattern[2] == self.PatternTree.GetItemText(PatternId)
     335            LimitId = G2gd.GetPatternTreeItemId(self,PatternId, 'Limits')
     336        N = PlotList.index(Pattern)
     337        X = xye[0]
     338        Y = xye[1]+offset*N
     339        if LimitId:
     340            limits = self.PatternTree.GetItemPyData(LimitId)
     341            Lines.append(Plot.axvline(limits[1][0],color='g',dashes=(5,5),picker=3.))   
     342            Lines.append(Plot.axvline(limits[1][1],color='r',dashes=(5,5),picker=3.))                   
     343        if self.Contour:
     344            ContourY.append(N)
     345            ContourZ.append(Y)
     346            ContourX = X
     347            Nseq += 1
     348            Plot.set_ylabel('Data sequence',fontsize=12)
     349        else:
     350            if ifpicked:
     351                Z = xye[3]+offset*N
     352                W = xye[4]+offset*N
     353                D = xye[5]+offset*N
     354                if self.Weight:
     355                    W2 = np.sqrt(xye[2])
     356                    D *= W2
     357                Plot.plot(X,Y,colors[N%6]+'+',picker=3.,clip_on=False)
     358                Plot.plot(X,Z,colors[(N+1)%6],picker=False)
     359                Plot.plot(X,W,colors[(N+2)%6],picker=False)
     360                Plot.plot(X,D,colors[(N+3)%6],picker=False)
     361                Plot.axhline(0.,color=wx.BLACK)
     362                Page.canvas.SetToolTipString('')
     363                if self.PatternTree.GetItemText(PickId) == 'Peak List':
     364                    tip = 'On data point: Pick peak - L or R MB.On line: MB down to move'
     365                    Page.canvas.SetToolTipString(tip)
     366                    data = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Peak List'))
     367                    for item in data:
     368                        Lines.append(Plot.axvline(item[0],color=colors[N%6],picker=2.))
     369                if self.PatternTree.GetItemText(PickId) == 'Limits':
     370                    tip = 'On data point: Lower limit - L MB; Upper limit - R MB. On limit: MB down to move'
     371                    Page.canvas.SetToolTipString(tip)
     372                    data = self.LimitsTable.GetData()
     373            else:
     374                Plot.plot(X,Y,colors[N%6],picker=False)
     375    if PickId and self.PatternTree.GetItemText(PickId) in ['Index Peak List','Unit Cells List']:
     376        peaks = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Index Peak List'))
     377        for peak in peaks:
     378            Plot.axvline(peak[0],color='b')
     379        for hkl in self.HKL:
     380            Plot.axvline(hkl[5],color='r',dashes=(5,5))
     381    if self.Contour:
     382        acolor = mpl.cm.get_cmap('Paired')
     383        Plot.contourf(ContourX,ContourY,ContourZ,cmap=acolor)
     384#        Plot.set_ylim(0,Nseq-1)
     385    else:
     386        self.Lines = Lines
     387    if not newPlot:
     388        Page.toolbar.push_current()
     389        Plot.set_xlim(xylim[0])
     390        Plot.set_ylim(xylim[1])
     391        xylim = []
     392        Page.toolbar.push_current()
     393        Page.toolbar.draw()
     394    else:
     395        Page.canvas.draw()
     396
     397   
     398    self.Pwdr = True
     399
     400def PlotPowderLines(self):
     401
     402    def OnMotion(event):
     403        xpos = event.xdata
     404        if xpos:                                        #avoid out of frame mouse position
     405            Page.canvas.SetCursor(wx.CROSS_CURSOR)
     406            self.G2plotNB.status.SetFields(['2-theta =%9.3f '%(xpos,),])
     407
     408    try:
     409        plotNum = self.G2plotNB.plotList.index('Powder Lines')
     410        Page = self.G2plotNB.nb.GetPage(plotNum)
     411        Page.figure.clf()
     412        Plot = Page.figure.gca()
     413    except ValueError,error:
     414        Plot = self.G2plotNB.add('Powder Lines').gca()
     415        plotNum = self.G2plotNB.plotList.index('Powder Lines')
     416        Page = self.G2plotNB.nb.GetPage(plotNum)
     417        Page.canvas.mpl_connect('motion_notify_event', OnMotion)
     418       
     419    Page.SetFocus()
     420    Plot.set_title('Powder Pattern Lines')
     421    Plot.set_xlabel(r'$\mathsf{2\theta}$',fontsize=14)
     422    PickId = self.PickId
     423    PatternId = self.PatternId
     424    peaks = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Index Peak List'))
     425    for peak in peaks:
     426        Plot.axvline(peak[0],color='b')
     427    for hkl in self.HKL:
     428        Plot.axvline(hkl[5],color='r',dashes=(5,5))
     429    xmin = peaks[0][0]
     430    xmax = peaks[-1][0]
     431    delt = xmax-xmin
     432    xlim = [max(0,xmin-delt/20.),min(180.,xmax+delt/20.)]
     433    Plot.set_xlim(xlim)
     434    Page.canvas.draw()
     435
     436def PlotPeakWidths(self):
     437    PatternId = self.PatternId
     438    limitID = G2gd.GetPatternTreeItemId(self,PatternId, 'Limits')
     439    if limitID:
     440        limits = self.PatternTree.GetItemPyData(limitID)
     441    else:
     442        return
     443    instParms = self.PatternTree.GetItemPyData( \
     444        G2gd.GetPatternTreeItemId(self,PatternId, 'Instrument Parameters'))
     445    if instParms[0][0] == 'PXC':
     446        lam = instParms[1][1]
     447        if len(instParms[1]) == 12:
     448            GU,GV,GW,LX,LY = instParms[0][6:11]
     449        else:
     450            GU,GV,GW,LX,LY = instParms[0][4:9]
     451    peakID = G2gd.GetPatternTreeItemId(self,PatternId, 'Peak List')
     452    if peakID:
     453        peaks = self.PatternTree.GetItemPyData(peakID)
     454    else:
     455        peaks = []
     456   
     457    try:
     458        plotNum = self.G2plotNB.plotList.index('Peak Widths')
     459        Page = self.G2plotNB.nb.GetPage(plotNum)
     460        Page.figure.clf()
     461        Plot = Page.figure.gca()
     462    except ValueError,error:
     463        Plot = self.G2plotNB.add('Peak Widths').gca()
     464        plotNum = self.G2plotNB.plotList.index('Peak Widths')
     465        Page = self.G2plotNB.nb.GetPage(plotNum)
     466    Page.SetFocus()
     467   
     468    Page.canvas.SetToolTipString('')
     469    colors=['b','g','r','c','m','k']
     470    Xmin,Xmax = limits[1]
     471    Xmin = min(0.5,max(Xmin,1))
     472    Xmin /= 2
     473    Xmax /= 2
     474    nPts = 100
     475    delt = (Xmax-Xmin)/nPts
     476    thetas = []
     477    for i in range(nPts):
     478        thetas.append(Xmin+i*delt)
     479    X = []
     480    Y = []
     481    Z = []
     482    W = []
     483    sig = lambda Th,U,V,W: 1.17741*math.sqrt(U*tand(Th)**2+V*tand(Th)+W)*math.pi/18000.
     484    gam = lambda Th,X,Y: (X/cosd(Th)+Y*tand(Th))*math.pi/18000.
     485    gamFW = lambda s,g: math.exp(math.log(g**5+2.69269*g**4*s+2.42843*g**3*s**2+4.47163*g**2*s**3+0.07842*g*s**4+s**5)/5.)
     486    for theta in thetas:
     487        X.append(4.0*math.pi*sind(theta)/lam)              #q
     488        s = sig(theta,GU,GV,GW)
     489        g = gam(theta,LX,LY)
     490        G = gamFW(g,s)
     491        Y.append(s/tand(theta))
     492        Z.append(g/tand(theta))
     493        W.append(G/tand(theta))
     494    Plot.set_title('Instrument and sample peak widths')
     495    Plot.set_ylabel(r'$\Delta q/q, \Delta d/d$',fontsize=14)
     496    Plot.set_xlabel(r'$q, \AA^{-1}$',fontsize=14)
     497    Plot.plot(X,Y,color='r',label='Gaussian')
     498    Plot.plot(X,Z,color='g',label='Lorentzian')
     499    Plot.plot(X,W,color='b',label='G+L')
     500    X = []
     501    Y = []
     502    Z = []
     503    W = []
     504    for peak in peaks:
     505        X.append(4.0*math.pi*sind(peak[0]/2.0)/lam)
     506        s = 1.17741*math.sqrt(peak[4])*math.pi/18000.
     507        g = peak[6]*math.pi/18000.
     508        G = gamFW(g,s)
     509        Y.append(s/tand(peak[0]/2.))
     510        Z.append(g/tand(peak[0]/2.))
     511        W.append(G/tand(peak[0]/2.))
     512    Plot.plot(X,Y,'+',color='r',label='G peak')
     513    Plot.plot(X,Z,'+',color='g',label='L peak')
     514    Plot.plot(X,W,'+',color='b',label='G+L peak')
     515    Plot.legend(loc='best')
     516    Page.canvas.draw()
     517
    179518def PlotImage(self,newPlot=False):
    180519    from matplotlib.patches import Ellipse,Arc
    181520
    182521    def OnImMotion(event):
    183         imgPage.canvas.SetToolTipString('')
     522        Page.canvas.SetToolTipString('')
    184523        size = len(self.ImageZ)
    185524        if event.xdata and event.ydata:                 #avoid out of frame errors
    186525            Data = self.PatternTree.GetItemPyData( \
    187526                G2gd.GetPatternTreeItemId(self,self.Image, 'Image Controls'))
    188             imgPage.canvas.SetCursor(wx.CROSS_CURSOR)
     527            Page.canvas.SetCursor(wx.CROSS_CURSOR)
    189528            item = self.itemPicked
    190529            pixelSize = Data['pixelSize']
     
    193532            if item and self.PatternTree.GetItemText(self.PickId) == 'Image Controls':
    194533                if 'Text' in str(item):
    195                     imgPage.canvas.SetToolTipString('%8.3f %8.3fmm'%(event.xdata,event.ydata))
     534                    Page.canvas.SetToolTipString('%8.3f %8.3fmm'%(event.xdata,event.ydata))
    196535                else:
    197536                    xcent,ycent = Data['center']
     
    200539                    if 'line3' in  str(item) or 'line4' in str(item) and not Data['fullIntegrate']:
    201540                        ang = int(atan2d(xpos,ypos))
    202                         imgPage.canvas.SetToolTipString('%6d deg'%(ang))
     541                        Page.canvas.SetToolTipString('%6d deg'%(ang))
    203542                    elif 'line1' in  str(item) or 'line2' in str(item):
    204543                        tth = G2cmp.GetTth(event.xdata,event.ydata,Data)
    205                         imgPage.canvas.SetToolTipString('%8.3fdeg'%(tth))                           
     544                        Page.canvas.SetToolTipString('%8.3fdeg'%(tth))                           
    206545            else:
    207546                xpos = event.xdata
     
    210549                ypix = ypos*scaley
    211550                if (0 <= xpix <= size) and (0 <= ypix <= size):
    212                     imgPage.canvas.SetToolTipString('%6d'%(self.ImageZ[ypix][xpix]))
     551                    Page.canvas.SetToolTipString('%6d'%(self.ImageZ[ypix][xpix]))
    213552                tth,azm,dsp = G2cmp.GetTthDspAzm(xpos,ypos,Data)
    214553                Q = 2.*math.pi/dsp
     
    248587                return
    249588            Ypos = event.ydata
    250             if Ypos and not imgPage.toolbar._active:         #make sure zoom/pan not selected
     589            if Ypos and not Page.toolbar._active:         #make sure zoom/pan not selected
    251590                if event.button == 1:
    252591                    Xpix = Xpos*scalex
     
    297636    try:
    298637        plotNum = self.G2plotNB.plotList.index('2D Powder Image')
    299         imgPage = self.G2plotNB.nb.GetPage(plotNum)
     638        Page = self.G2plotNB.nb.GetPage(plotNum)
    300639        if not newPlot:
    301             imgPlot = imgPage.figure.gca()          #get previous powder plot & get limits
    302             xylim = imgPlot.get_xlim(),imgPlot.get_ylim()
    303         imgPage.figure.clf()
    304         imgPlot = imgPage.figure.gca()          #get a fresh plot after clf()
     640            Plot = Page.figure.gca()          #get previous powder plot & get limits
     641            xylim = Plot.get_xlim(),Plot.get_ylim()
     642        Page.figure.clf()
     643        Plot = Page.figure.gca()          #get a fresh plot after clf()
    305644       
    306645    except ValueError,error:
    307         imgPlot = self.G2plotNB.add('2D Powder Image').gca()
     646        Plot = self.G2plotNB.add('2D Powder Image').gca()
    308647        plotNum = self.G2plotNB.plotList.index('2D Powder Image')
    309         imgPage = self.G2plotNB.nb.GetPage(plotNum)
    310         imgPage.canvas.mpl_connect('key_press_event', OnImPlotKeyPress)
    311         imgPage.canvas.mpl_connect('motion_notify_event', OnImMotion)
    312         imgPage.canvas.mpl_connect('pick_event', OnImPick)
    313         imgPage.canvas.mpl_connect('button_release_event', OnImRelease)
    314     imgPage.SetFocus()
    315        
    316     imgPlot.set_title(self.PatternTree.GetItemText(self.Image)[4:])
     648        Page = self.G2plotNB.nb.GetPage(plotNum)
     649        Page.canvas.mpl_connect('key_press_event', OnImPlotKeyPress)
     650        Page.canvas.mpl_connect('motion_notify_event', OnImMotion)
     651        Page.canvas.mpl_connect('pick_event', OnImPick)
     652        Page.canvas.mpl_connect('button_release_event', OnImRelease)
     653    Page.SetFocus()
     654       
     655    Plot.set_title(self.PatternTree.GetItemText(self.Image)[4:])
    317656    size,self.ImageZ = self.PatternTree.GetItemPyData(self.Image)
    318657    Data = self.PatternTree.GetItemPyData( \
     
    331670    acolor = mpl.cm.get_cmap(Data['color'])
    332671    xcent,ycent = Data['center']
    333     imgPlot.set_xlabel('Image x-axis, mm',fontsize=12)
    334     imgPlot.set_ylabel('Image y-axis, mm',fontsize=12)
     672    Plot.set_xlabel('Image x-axis, mm',fontsize=12)
     673    Plot.set_ylabel('Image y-axis, mm',fontsize=12)
    335674    A = G2cmp.ImageCompress(self.ImageZ,imScale)
    336     self.Img = imgPlot.imshow(A,aspect='equal',cmap=acolor, \
     675    self.Img = Plot.imshow(A,aspect='equal',cmap=acolor, \
    337676        interpolation='nearest',vmin=Imin,vmax=Imax,extent=[0,Xmax,Xmax,0])
    338677
    339     imgPlot.plot(xcent,ycent,'x')
     678    Plot.plot(xcent,ycent,'x')
    340679    if Data['showLines']:
    341680        LRAzim = Data['LRazimuth']                  #NB: integers
     
    356695            xyI = np.array(xyI)
    357696            arcxI,arcyI = xyI.T
    358             imgPlot.plot(arcxI,arcyI,picker=3)
     697            Plot.plot(arcxI,arcyI,picker=3)
    359698        if ellO:
    360699            xyO = []
     
    363702            xyO = np.array(xyO)
    364703            arcxO,arcyO = xyO.T
    365             imgPlot.plot(arcxO,arcyO,picker=3)
     704            Plot.plot(arcxO,arcyO,picker=3)
    366705        if ellO and ellI and not Data['fullIntegrate']:
    367             imgPlot.plot([arcxI[0],arcxO[0]],[arcyI[0],arcyO[0]],picker=3)
    368             imgPlot.plot([arcxI[-1],arcxO[-1]],[arcyI[-1],arcyO[-1]],picker=3)
     706            Plot.plot([arcxI[0],arcxO[0]],[arcyI[0],arcyO[0]],picker=3)
     707            Plot.plot([arcxI[-1],arcxO[-1]],[arcyI[-1],arcyO[-1]],picker=3)
    369708    for xring,yring in Data['ring']:
    370         imgPlot.text(xring,yring,'+',color='b',ha='center',va='center',picker=3)
     709        Plot.text(xring,yring,'+',color='b',ha='center',va='center',picker=3)
    371710    if Data['setRings']:
    372711        rings = np.concatenate((Data['rings']),axis=0)
    373712        for xring,yring,dsp in rings:
    374             imgPlot.text(xring,yring,'+',ha='center',va='center')           
     713            Plot.text(xring,yring,'+',ha='center',va='center')           
    375714    for ellipse in Data['ellipses']:
    376715        cent,phi,[width,height],col = ellipse
    377         imgPlot.add_artist(Ellipse([cent[0],cent[1]],2*width,2*height,phi,ec=col,fc='none'))
    378         imgPlot.text(cent[0],cent[1],'+',color=col,ha='center',va='center')
    379     colorBar = imgPage.figure.colorbar(self.Img)
    380     imgPlot.set_xlim(xlim)
    381     imgPlot.set_ylim(ylim)
     716        Plot.add_artist(Ellipse([cent[0],cent[1]],2*width,2*height,phi,ec=col,fc='none'))
     717        Plot.text(cent[0],cent[1],'+',color=col,ha='center',va='center')
     718    colorBar = Page.figure.colorbar(self.Img)
     719    Plot.set_xlim(xlim)
     720    Plot.set_ylim(ylim)
    382721    if not newPlot:
    383         imgPage.toolbar.push_current()
    384         imgPlot.set_xlim(xylim[0])
    385         imgPlot.set_ylim(xylim[1])
     722        Page.toolbar.push_current()
     723        Plot.set_xlim(xylim[0])
     724        Plot.set_ylim(xylim[1])
    386725        xylim = []
    387         imgPage.toolbar.push_current()
    388         imgPage.toolbar.draw()
     726        Page.toolbar.push_current()
     727        Page.toolbar.draw()
    389728    else:
    390         imgPage.canvas.draw()
     729        Page.canvas.draw()
    391730           
    392 def PlotPeakWidths(self):
    393     PatternId = self.PatternId
    394     limitID = G2gd.GetPatternTreeItemId(self,PatternId, 'Limits')
    395     if limitID:
    396         limits = self.PatternTree.GetItemPyData(limitID)
    397     else:
    398         return
    399     instParms = self.PatternTree.GetItemPyData( \
    400         G2gd.GetPatternTreeItemId(self,PatternId, 'Instrument Parameters'))
    401     if instParms[0][0] == 'PXC':
    402         lam = instParms[1][1]
    403         if len(instParms[1]) == 12:
    404             GU,GV,GW,LX,LY = instParms[0][6:11]
    405         else:
    406             GU,GV,GW,LX,LY = instParms[0][4:9]
    407     peakID = G2gd.GetPatternTreeItemId(self,PatternId, 'Peak List')
    408     if peakID:
    409         peaks = self.PatternTree.GetItemPyData(peakID)
    410     else:
    411         peaks = []
    412    
    413     try:
    414         plotNum = self.G2plotNB.plotList.index('Peak Widths')
    415         pkwPage = self.G2plotNB.nb.GetPage(plotNum)
    416         pkwPage.figure.clf()
    417         pkwPlot = pkwPage.figure.gca()
    418     except ValueError,error:
    419         pkwPlot = self.G2plotNB.add('Peak Widths').gca()
    420         plotNum = self.G2plotNB.plotList.index('Peak Widths')
    421         pkwPage = self.G2plotNB.nb.GetPage(plotNum)
    422     pkwPage.SetFocus()
    423    
    424     pkwPage.canvas.SetToolTipString('')
    425     colors=['b','g','r','c','m','k']
    426     Xmin,Xmax = limits[1]
    427     Xmin = min(0.5,max(Xmin,1))
    428     Xmin /= 2
    429     Xmax /= 2
    430     nPts = 100
    431     delt = (Xmax-Xmin)/nPts
    432     thetas = []
    433     for i in range(nPts):
    434         thetas.append(Xmin+i*delt)
    435     X = []
    436     Y = []
    437     Z = []
    438     W = []
    439     sig = lambda Th,U,V,W: 1.17741*math.sqrt(U*tand(Th)**2+V*tand(Th)+W)*math.pi/18000.
    440     gam = lambda Th,X,Y: (X/cosd(Th)+Y*tand(Th))*math.pi/18000.
    441     gamFW = lambda s,g: math.exp(math.log(g**5+2.69269*g**4*s+2.42843*g**3*s**2+4.47163*g**2*s**3+0.07842*g*s**4+s**5)/5.)
    442     for theta in thetas:
    443         X.append(4.0*math.pi*sind(theta)/lam)              #q
    444         s = sig(theta,GU,GV,GW)
    445         g = gam(theta,LX,LY)
    446         G = gamFW(g,s)
    447         Y.append(s/tand(theta))
    448         Z.append(g/tand(theta))
    449         W.append(G/tand(theta))
    450     pkwPlot.set_title('Instrument and sample peak widths')
    451     pkwPlot.set_ylabel(r'$\Delta q/q, \Delta d/d$',fontsize=14)
    452     pkwPlot.set_xlabel(r'$q, \AA^{-1}$',fontsize=14)
    453     pkwPlot.plot(X,Y,color='r',label='Gaussian')
    454     pkwPlot.plot(X,Z,color='g',label='Lorentzian')
    455     pkwPlot.plot(X,W,color='b',label='G+L')
    456     X = []
    457     Y = []
    458     Z = []
    459     W = []
    460     for peak in peaks:
    461         X.append(4.0*math.pi*sind(peak[0]/2.0)/lam)
    462         s = 1.17741*math.sqrt(peak[4])*math.pi/18000.
    463         g = peak[6]*math.pi/18000.
    464         G = gamFW(g,s)
    465         Y.append(s/tand(peak[0]/2.))
    466         Z.append(g/tand(peak[0]/2.))
    467         W.append(G/tand(peak[0]/2.))
    468     pkwPlot.plot(X,Y,'+',color='r',label='G peak')
    469     pkwPlot.plot(X,Z,'+',color='g',label='L peak')
    470     pkwPlot.plot(X,W,'+',color='b',label='G+L peak')
    471     pkwPlot.legend(loc='best')
    472     pkwPage.canvas.draw()
    473 
    474 def PlotPatterns(self,newPlot=False):
    475    
    476     def OnPick(event):
    477         if self.itemPicked is not None: return
    478         PatternId = self.PatternId
    479         PickId = self.PickId
    480         pick = event.artist
    481         mouse = event.mouseevent
    482         xpos = pick.get_xdata()
    483         ypos = pick.get_ydata()
    484         ind = event.ind
    485         view = pdrPage.toolbar._views.forward()
    486         if view and 'line2' in str(pick):           #apply offset only for picked powder pattern points
    487             ind += np.searchsorted(xye[0],view[0][0])
    488         xy = zip(xpos[ind],ypos[ind])[0]
    489         if self.PatternTree.GetItemText(PickId) == 'Peak List':
    490             if ind.all() != [0]:                                    #picked a data point
    491                 inst = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Instrument Parameters'))
    492                 if len(inst[1]) == 10:
    493                     ins = inst[1][4:10]
    494                 else:
    495                     ins = inst[1][6:12]   
    496                 sig = ins[0]*tand(xy[0]/2.0)**2+ins[1]*tand(xy[0]/2.0)+ins[2]
    497                 gam = ins[3]/cosd(xy[0]/2.0)+ins[4]*tand(xy[0]/2.0)           
    498                 data = self.PatternTree.GetItemPyData(self.PickId)
    499                 XY = [xy[0],0, xy[1],1, sig,0, gam,0, ins[5],0]       #default refine intensity 1st   
    500                 data.append(XY)
    501                 G2gd.UpdatePeakGrid(self,data)
    502                 PlotPatterns(self)
    503             else:                                                   #picked a peak list line
    504                 self.itemPicked = pick
    505         elif self.PatternTree.GetItemText(PickId) == 'Limits':
    506             if ind.all() != [0]:                                    #picked a data point
    507                 LimitId = G2gd.GetPatternTreeItemId(self,PatternId, 'Limits')
    508                 data = self.PatternTree.GetItemPyData(LimitId)
    509                 if mouse.button==1:
    510                     data[1][0] = min(xy[0],data[1][1])
    511                 if mouse.button==3:
    512                     data[1][1] = max(xy[0],data[1][0])
    513                 self.PatternTree.SetItemPyData(LimitId,data)
    514                 G2gd.UpdateLimitsGrid(self,data)
    515                 PlotPatterns(self)
    516             else:                                                   #picked a limit line
    517                 self.itemPicked = pick               
    518        
    519     def OnPlotKeyPress(event):
    520         if event.key == 'w':
    521             if self.Weight:
    522                 self.Weight = False
    523             else:
    524                 self.Weight = True
    525             print 'plot weighting:',self.Weight
    526         elif event.key == 'u' and self.Offset < 100.:
    527             self.Offset += 1.
    528         elif event.key == 'd' and self.Offset > 0.:
    529             self.Offset -= 1.
    530         elif event.key == 'c':
    531             print 'contouring'
    532             if self.Contour:
    533                 self.Contour = False
    534             else:
    535                 self.Contour = True
    536         else:
    537             event.Skip(True)
    538         PlotPatterns(self)
    539                        
    540     def OnMotion(event):
    541         xpos = event.xdata
    542         if xpos:                                        #avoid out of frame mouse position
    543             ypos = event.ydata
    544             wave = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self, \
    545             PatternId, 'Instrument Parameters'))[0][1]
    546             dsp = 0.0
    547             if abs(xpos) > 0.:
    548                 dsp = wave/(2.*sind(abs(xpos)/2.0))
    549             pdrPage.canvas.SetCursor(wx.CROSS_CURSOR)
    550             self.G2plotNB.status.SetFields(['2-theta =%9.3f d =%9.5f Intensity =%9.1f'%(xpos,dsp,ypos),])
    551             if self.itemPicked:
    552                 pdrPage.canvas.SetToolTipString('%9.3f'%(xpos))
    553                    
    554     def OnRelease(event):
    555         if self.itemPicked is None: return
    556         xpos = event.xdata
    557         if xpos:                                        #avoid out of frame mouse position
    558             lines = []
    559             for line in self.Lines: lines.append(line.get_xdata()[0])
    560             lineNo = lines.index(self.itemPicked.get_xdata()[0])
    561             if  lineNo in [0,1]:
    562                 LimitId = G2gd.GetPatternTreeItemId(self,self.PatternId, 'Limits')
    563                 data = self.PatternTree.GetItemPyData(LimitId)
    564                 print 'limits',xpos
    565                 data[1][lineNo] = xpos
    566                 self.PatternTree.SetItemPyData(LimitId,data)
    567                 if self.PatternTree.GetItemText(self.PickId) == 'Limits':
    568                     G2gd.UpdateLimitsGrid(self,data)
    569             else:
    570                 PeakId = G2gd.GetPatternTreeItemId(self,self.PatternId, 'Peak List')
    571                 data = self.PatternTree.GetItemPyData(PeakId)
    572                 print 'peaks',xpos
    573                 data[lineNo-2][0] = xpos
    574                 self.PatternTree.SetItemPyData(PeakId,data)
    575                 G2gd.UpdatePeakGrid(self,data)
    576         PlotPatterns(self)
    577         self.itemPicked = None   
    578 
    579     xylim = []
    580     try:
    581         plotNum = self.G2plotNB.plotList.index('Powder Patterns')
    582         pdrPage = self.G2plotNB.nb.GetPage(plotNum)
    583         if not newPlot:
    584             pdrPlot = pdrPage.figure.gca()          #get previous powder plot & get limits
    585             xylim = pdrPlot.get_xlim(),pdrPlot.get_ylim()
    586         pdrPage.figure.clf()
    587         pdrPlot = pdrPage.figure.gca()          #get a fresh plot after clf()
    588     except ValueError,error:
    589         newPlot = True
    590         pdrPlot = self.G2plotNB.add('Powder Patterns').gca()
    591         plotNum = self.G2plotNB.plotList.index('Powder Patterns')
    592         pdrPage = self.G2plotNB.nb.GetPage(plotNum)
    593         pdrPage.canvas.mpl_connect('key_press_event', OnPlotKeyPress)
    594         pdrPage.canvas.mpl_connect('motion_notify_event', OnMotion)
    595         pdrPage.canvas.mpl_connect('pick_event', OnPick)
    596         pdrPage.canvas.mpl_connect('button_release_event', OnRelease)
    597        
    598     pdrPage.SetFocus()
    599 
    600     PickId = self.PickId
    601     PatternId = self.PatternId
    602     colors=['b','g','r','c','m','k']
    603     PlotList = []
    604     Lines = []
    605     item, cookie = self.PatternTree.GetFirstChild(self.root)
    606     while item:
    607         if 'PWDR' in self.PatternTree.GetItemText(item):
    608             Pattern = self.PatternTree.GetItemPyData(item)
    609             Pattern.append(self.PatternTree.GetItemText(item))
    610             PlotList.append(Pattern)
    611         item, cookie = self.PatternTree.GetNextChild(self.root, cookie)               
    612     Ymax = 1.0
    613     for Pattern in PlotList:
    614         xye = Pattern[1]
    615         Ymax = max(Ymax,max(xye[1]))
    616     offset = self.Offset*Ymax/100.0
    617     pdrPlot.set_title('Powder Patterns')
    618     pdrPlot.set_xlabel(r'$\mathsf{2\theta}$',fontsize=14)
    619     pdrPlot.set_ylabel('Intensity',fontsize=12)
    620     if self.Contour:
    621         ContourZ = []
    622         ContourY = []
    623         Nseq = 0
    624     for Pattern in PlotList:
    625         ifpicked = False
    626         LimitId = 0
    627         xye = Pattern[1]
    628         if PickId:
    629             ifpicked = Pattern[2] == self.PatternTree.GetItemText(PatternId)
    630             LimitId = G2gd.GetPatternTreeItemId(self,PatternId, 'Limits')
    631         N = PlotList.index(Pattern)
    632         X = xye[0]
    633         Y = xye[1]+offset*N
    634         if LimitId:
    635             limits = self.PatternTree.GetItemPyData(LimitId)
    636             Lines.append(pdrPlot.axvline(limits[1][0],color='g',dashes=(5,5),picker=3.))   
    637             Lines.append(pdrPlot.axvline(limits[1][1],color='r',dashes=(5,5),picker=3.))                   
    638         if self.Contour:
    639             ContourY.append(N)
    640             ContourZ.append(Y)
    641             ContourX = X
    642             Nseq += 1
    643             pdrPlot.set_ylabel('Data sequence',fontsize=12)
    644         else:
    645             if ifpicked:
    646                 Z = xye[3]+offset*N
    647                 W = xye[4]+offset*N
    648                 D = xye[5]+offset*N
    649                 if self.Weight:
    650                     W2 = np.sqrt(xye[2])
    651                     D *= W2
    652                 pdrPlot.plot(X,Y,colors[N%6]+'+',picker=3.,clip_on=False)
    653                 pdrPlot.plot(X,Z,colors[(N+1)%6],picker=False)
    654                 pdrPlot.plot(X,W,colors[(N+2)%6],picker=False)
    655                 pdrPlot.plot(X,D,colors[(N+3)%6],picker=False)
    656                 pdrPlot.axhline(0.,color=wx.BLACK)
    657                 pdrPage.canvas.SetToolTipString('')
    658                 if self.PatternTree.GetItemText(PickId) == 'Peak List':
    659                     tip = 'On data point: Pick peak - L or R MB.On line: MB down to move'
    660                     pdrPage.canvas.SetToolTipString(tip)
    661                     data = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Peak List'))
    662                     for item in data:
    663                         Lines.append(pdrPlot.axvline(item[0],color=colors[N%6],picker=2.))
    664                 if self.PatternTree.GetItemText(PickId) == 'Limits':
    665                     tip = 'On data point: Lower limit - L MB; Upper limit - R MB. On limit: MB down to move'
    666                     pdrPage.canvas.SetToolTipString(tip)
    667                     data = self.LimitsTable.GetData()
    668             else:
    669                 pdrPlot.plot(X,Y,colors[N%6],picker=False)
    670     if PickId and self.PatternTree.GetItemText(PickId) in ['Index Peak List','Unit Cells List']:
    671         peaks = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Index Peak List'))
    672         for peak in peaks:
    673             pdrPlot.axvline(peak[0],color='b')
    674         for hkl in self.HKL:
    675             pdrPlot.axvline(hkl[5],color='r',dashes=(5,5))
    676     if self.Contour:
    677         acolor = mpl.cm.get_cmap('Paired')
    678         pdrPlot.contourf(ContourX,ContourY,ContourZ,cmap=acolor)
    679 #        pdrPlot.set_ylim(0,Nseq-1)
    680     else:
    681         self.Lines = Lines
    682     if not newPlot:
    683         pdrPage.toolbar.push_current()
    684         pdrPlot.set_xlim(xylim[0])
    685         pdrPlot.set_ylim(xylim[1])
    686         xylim = []
    687         pdrPage.toolbar.push_current()
    688         pdrPage.toolbar.draw()
    689     else:
    690         pdrPage.canvas.draw()
    691 
    692    
    693     self.Pwdr = True
    694 
    695 def PlotPowderLines(self):
    696 
    697     def OnMotion(event):
    698         xpos = event.xdata
    699         if xpos:                                        #avoid out of frame mouse position
    700             pksPage.canvas.SetCursor(wx.CROSS_CURSOR)
    701             self.G2plotNB.status.SetFields(['2-theta =%9.3f '%(xpos,),])
    702 
    703     try:
    704         plotNum = self.G2plotNB.plotList.index('Powder Lines')
    705         pksPage = self.G2plotNB.nb.GetPage(plotNum)
    706         pksPage.figure.clf()
    707         pksPlot = pksPage.figure.gca()
    708     except ValueError,error:
    709         newPlot = True
    710         pksPlot = self.G2plotNB.add('Powder Lines').gca()
    711         plotNum = self.G2plotNB.plotList.index('Powder Lines')
    712         pksPage = self.G2plotNB.nb.GetPage(plotNum)
    713         pksPage.canvas.mpl_connect('motion_notify_event', OnMotion)
    714        
    715     pksPage.SetFocus()
    716     pksPlot.set_title('Powder Pattern Lines')
    717     pksPlot.set_xlabel(r'$\mathsf{2\theta}$',fontsize=14)
    718     PickId = self.PickId
    719     PatternId = self.PatternId
    720     peaks = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,PatternId, 'Index Peak List'))
    721     for peak in peaks:
    722         pksPlot.axvline(peak[0],color='b')
    723     for hkl in self.HKL:
    724         pksPlot.axvline(hkl[5],color='r',dashes=(5,5))
    725     xmin = peaks[0][0]
    726     xmax = peaks[-1][0]
    727     delt = xmax-xmin
    728     xlim = [max(0,xmin-delt/20.),min(180.,xmax+delt/20.)]
    729     pksPlot.set_xlim(xlim)
    730     pksPage.canvas.draw()
    731 
    732 
    733731def PlotTRImage(self,newPlot=False):
    734732           
     
    801799    Page.SetFocus()
    802800       
    803     data = self.PatternTree.GetItemPyData(self.PickId)
     801    Data = self.PatternTree.GetItemPyData( \
     802        G2gd.GetPatternTreeItemId(self,self.Image, 'Image Controls'))
    804803    image = self.ImageZ
    805804    Iz = len(image)
    806     Imin,Imax = data['range'][1]
     805    Imin,Imax = Data['range'][1]
    807806    step = (Imax-Imin)/5.
    808807    V = np.arange(Imin,Imax,step)
    809     acolor = mpl.cm.get_cmap('Paired')
     808    acolor = mpl.cm.get_cmap(Data['color'])
    810809    Plot.set_xlabel('azimuth',fontsize=12)
    811810    Plot.set_ylabel('2-theta',fontsize=12)
    812     Plot.contour(self.TA[1],self.TA[0],image,V,cmap=acolor)
    813     if data['showLines']:
    814         IOtth = data['IOtth']
    815         LRAzim = data['LRazimuth']                  #NB: integers
     811    Plot.contour(self.TA[:,:,0],self.TA[:,:,1],self.TA[:,:,2],V,cmap=acolor)
     812    if Data['showLines']:
     813        IOtth = Data['IOtth']
     814        LRAzim = Data['LRazimuth']                  #NB: integers
    816815        Plot.plot([LRAzim[0],LRAzim[1]],[IOtth[0],IOtth[0]],picker=True)
    817816        Plot.plot([LRAzim[0],LRAzim[1]],[IOtth[1],IOtth[1]],picker=True)
     
    827826    else:
    828827        Page.canvas.draw()
     828       
     829def PlotExposedImage(self,newPlot=False):
     830    plotNo = self.G2plotNB.nb.GetSelection()
     831    if self.G2plotNB.nb.GetPageText(plotNo) == '2D Transformed Powder Image':
     832        PlotTRImage(self,newPlot)
     833    elif self.G2plotNB.nb.GetPageText(plotNo) == '2D Powder Image':
     834        PlotImage(self,newPlot)
     835    elif self.G2plotNB.nb.GetPageText(plotNo) == '2D Integration':
     836        PlotIntegration(self,newPlot)
     837       
     838def PlotIntegration(self,newPlot=False):
    829839           
    830  
     840    def OnMotion(event):
     841        Page.canvas.SetToolTipString('')
     842        Page.canvas.SetCursor(wx.CROSS_CURSOR)
     843        azm = event.xdata
     844        tth = event.ydata
     845        if azm and tth:
     846            self.G2plotNB.status.SetFields(\
     847                ['Detector 2-th =%9.2fdeg, azm = %7.2fdeg'%(tth,azm),])
     848                               
     849    try:
     850        plotNum = self.G2plotNB.plotList.index('2D Integration')
     851        Page = self.G2plotNB.nb.GetPage(plotNum)
     852        if not newPlot:
     853            Plot = Page.figure.gca()          #get previous plot & get limits
     854            xylim = Plot.get_xlim(),Plot.get_ylim()
     855        Page.figure.clf()
     856        Plot = Page.figure.gca()          #get a fresh plot after clf()
     857       
     858    except ValueError,error:
     859        Plot = self.G2plotNB.add('2D Integration').gca()
     860        plotNum = self.G2plotNB.plotList.index('2D Integration')
     861        Page = self.G2plotNB.nb.GetPage(plotNum)
     862        Page.canvas.mpl_connect('motion_notify_event', OnMotion)
     863        Page.views = False
     864        view = False
     865    Page.SetFocus()
     866       
     867    Data = self.PatternTree.GetItemPyData( \
     868        G2gd.GetPatternTreeItemId(self,self.Image, 'Image Controls'))
     869    image = self.Integrate[0]
     870    xsc = self.Integrate[1]
     871    ysc = self.Integrate[2]
     872    Imin,Imax = Data['range'][1]
     873    acolor = mpl.cm.get_cmap(Data['color'])
     874    Plot.set_ylabel('azimuth',fontsize=12)
     875    Plot.set_xlabel('2-theta',fontsize=12)
     876    Plot.imshow(image,cmap=acolor,vmin=Imin,vmax=Imax,interpolation='nearest', \
     877        extent=[ysc[0],ysc[-1],xsc[0],xsc[-1]],aspect='auto')
     878    if not newPlot:
     879        Page.toolbar.push_current()
     880        Plot.set_xlim(xylim[0])
     881        Plot.set_ylim(xylim[1])
     882        xylim = []
     883        Page.toolbar.push_current()
     884        Page.toolbar.draw()
     885    else:
     886        Page.canvas.draw()
     887       
Note: See TracChangeset for help on using the changeset viewer.