Changeset 63


Ignore:
Timestamp:
May 13, 2010 9:17:31 AM (13 years ago)
Author:
vondreel
Message:

some refactoring of integrate routines in prep for an "integrate all" command.
menu details add '...' to those that want file names next as per GUI style

Location:
trunk
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/GSASII.py

    r62 r63  
    1818
    1919# print versions
    20 print "Available python module versions for pyGSASII:"
     20print "Available python module versions for GSASII:"
    2121print "python:     ",sys.version[:5]
    2222print "wxpython:   ",wx.__version__
     
    7272    def _init_coll_File_Items(self, parent):
    7373        parent.Append(help='Open a gsasii project file (*.gpx)', id=wxID_GSASIIFILEOPEN,
    74              kind=wx.ITEM_NORMAL,text='Open project')
     74             kind=wx.ITEM_NORMAL,text='Open project...')
    7575        parent.Append(help='SAve project to old file', id=wxID_GSASIIFILESAVE,
    7676            kind=wx.ITEM_NORMAL,text='Save project')
    7777        parent.Append(help='Save project to new file', id=wxID_GSASIIFILESAVEAS,
    78             kind=wx.ITEM_NORMAL,text='SaveAs')
     78            kind=wx.ITEM_NORMAL,text='Save As...')
    7979        parent.Append(help='Close project, saving is optional', id=wxID_GSASIIFILECLOSE,
    8080            kind=wx.ITEM_NORMAL,text='Close project')
     
    8989    def _init_coll_Data_Items(self,parent):
    9090        parent.Append(help='', id=wxID_GSASIIPWDRREAD, kind=wx.ITEM_NORMAL,
    91             text='Read powder data')
     91            text='Read powder data...')
    9292        parent.Append(help='',id=wxID_GSASIIIMGREAD, kind=wx.ITEM_NORMAL,
    93             text='Read image data')
     93            text='Read image data...')
    9494        parent.Append(help='',id=wxID_GSASIIREADPEAKS, kind=wx.ITEM_NORMAL,
    95             text='Read Powder Pattern Peaks')
     95            text='Read Powder Pattern Peaks...')
    9696        parent.Append(help='', id=wxID_GSASIISNGLREAD, kind=wx.ITEM_NORMAL,
    97             text='Read single crystal data')
     97            text='Read single crystal data...')
    9898        parent.Append(help='', id=wxID_GSASIIPWDSUM, kind=wx.ITEM_NORMAL,
    9999            text='Sum powder data')
     
    124124    def _init_coll_Import_Items(self,parent):
    125125        self.ImportPhase = parent.Append(help='Import phase data from GSAS EXP file',
    126             id=wxID_GSASIIIMPORTPHASE, kind=wx.ITEM_NORMAL,text='Import GSAS EXP Phase')
     126            id=wxID_GSASIIIMPORTPHASE, kind=wx.ITEM_NORMAL,text='Import GSAS EXP Phase...')
    127127        self.ImportPDB = parent.Append(help='Import phase data from PDB file',
    128             id=wxID_GSASIIIMPORTPDB, kind=wx.ITEM_NORMAL,text='Import PDB Phase')
     128            id=wxID_GSASIIIMPORTPDB, kind=wx.ITEM_NORMAL,text='Import PDB Phase...')
    129129        self.ImportPattern = parent.Append(help='',id=wxID_GSASIIIMPORTPATTERN, kind=wx.ITEM_NORMAL,
    130             text='Import Powder Pattern')
     130            text='Import Powder Pattern...')
    131131        self.ImportHKL = parent.Append(help='',id=wxID_GSASIIIMPORTHKL, kind=wx.ITEM_NORMAL,
    132             text='Import HKLs')
     132            text='Import HKLs...')
    133133        self.ImportCIF = parent.Append(help='',id=wxID_GSASIIIMPORTCIF, kind=wx.ITEM_NORMAL,
    134             text='Import CIF')
     134            text='Import CIF...')
    135135        self.Bind(wx.EVT_MENU, self.OnImportPhase, id=wxID_GSASIIIMPORTPHASE)
    136136        self.Bind(wx.EVT_MENU, self.OnImportPDB, id=wxID_GSASIIIMPORTPDB)
     
    141141    def _init_coll_Export_Items(self,parent):
    142142        self.ExportPattern = parent.Append(help='Select PWDR item to enable',id=wxID_GSASIIEXPORTPATTERN, kind=wx.ITEM_NORMAL,
    143             text='Export Powder Pattern')
     143            text='Export Powder Pattern...')
    144144        self.ExportPeakList = parent.Append(help='',id=wxID_GSASIIEXPORTPEAKLIST, kind=wx.ITEM_NORMAL,
    145             text='Export All Peak Lists')
     145            text='Export All Peak Lists...')
    146146        self.ExportHKL = parent.Append(help='',id=wxID_GSASIIEXPORTHKL, kind=wx.ITEM_NORMAL,
    147             text='Export HKLs')
     147            text='Export HKLs...')
    148148        self.ExportPhase = parent.Append(help='',id=wxID_GSASIIEXPORTPHASE, kind=wx.ITEM_NORMAL,
    149             text='Export Phase')
     149            text='Export Phase...')
    150150        self.ExportCIF = parent.Append(help='',id=wxID_GSASIIEXPORTCIF, kind=wx.ITEM_NORMAL,
    151             text='Export CIF')
     151            text='Export CIF...')
    152152        self.ExportPattern.Enable(False)
    153153        self.ExportPeakList.Enable(True)
     
    237237        self.Image = 0
    238238        self.oldImagefile = ''
    239         self.Img = 0
    240239        self.Integrate = 0
    241240        self.Pwdr = False
     
    393392                            Data['pixLimit'] = 20
    394393                            Data['ellipses'] = []
    395                             Data['masks'] = []
    396394                            Data['calibrant'] = ''
    397395                        else:
     
    405403                            Data['pixLimit'] = 20
    406404                            Data['ellipses'] = []
    407                             Data['masks'] = []
    408405                            Data['calibrant'] = ''
    409406                            Data['IOtth'] = [2.0,5.0]
     
    416413                        Data['range'] = [(Imin,Imax),[Imin,Imax]]
    417414                        self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='Image Controls'),Data)
     415                        Masks = {'Points':[],'Rings':[],'Arcs':[],'Polygons':[],'Thresholds':[(Imin,Imax),[Imin,Imax]]}
     416                        self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='Masks'),Masks)
    418417                        self.PatternTree.SetItemPyData(Id,[Size,imagefile])
    419418                        self.PickId = Id
     
    469468            self.PatternTree.SetItemPyData(sub,[0])
    470469               
     470    class CopyDialog(wx.Dialog):
     471        def __init__(self,parent,title,text,data):
     472            wx.Dialog.__init__(self,parent,-1,title,
     473                pos=wx.DefaultPosition,style=wx.DEFAULT_DIALOG_STYLE)
     474            self.data = data
     475            panel = wx.Panel(self)
     476            mainSizer = wx.BoxSizer(wx.VERTICAL)
     477            topLabl = wx.StaticText(panel,-1,text)
     478            mainSizer.Add((10,10),1)
     479            mainSizer.Add(topLabl,0,wx.ALIGN_CENTER_VERTICAL|wx.LEFT,10)
     480            mainSizer.Add((10,10),1)
     481            dataGridSizer = wx.FlexGridSizer(rows=len(data),cols=1,hgap=2,vgap=2)
     482            for id,item in enumerate(self.data[:-1]):
     483                ckbox = wx.CheckBox(panel,id,item[1])
     484                ckbox.Bind(wx.EVT_CHECKBOX,self.OnCopyChange)                   
     485                dataGridSizer.Add(ckbox,0,wx.LEFT,10)
     486            mainSizer.Add(dataGridSizer,0,wx.EXPAND)
     487            OkBtn = wx.Button(panel,-1,"Ok")
     488            OkBtn.Bind(wx.EVT_BUTTON, self.OnOk)
     489            cancelBtn = wx.Button(panel,-1,"Cancel")
     490            cancelBtn.Bind(wx.EVT_BUTTON, self.OnCancel)
     491            btnSizer = wx.BoxSizer(wx.HORIZONTAL)
     492            btnSizer.Add((20,20),1)
     493            btnSizer.Add(OkBtn)
     494            btnSizer.Add((20,20),1)
     495            btnSizer.Add(cancelBtn)
     496            btnSizer.Add((20,20),1)
     497           
     498            mainSizer.Add(btnSizer,0,wx.EXPAND|wx.BOTTOM|wx.TOP, 10)
     499            panel.SetSizer(mainSizer)
     500            panel.Fit()
     501            self.Fit()
     502       
     503        def OnCopyChange(self,event):
     504            id = event.GetId()
     505            self.data[id][0] = self.FindWindowById(id).GetValue()       
     506           
     507        def OnOk(self,event):
     508            parent = self.GetParent()
     509            parent.Raise()
     510            self.SetReturnCode(wx.ID_OK)
     511            self.MakeModal(False)             
     512            self.Destroy()
     513           
     514        def OnCancel(self,event):
     515            parent = self.GetParent()
     516            parent.Raise()
     517            self.SetReturnCode(wx.ID_CANCEL)
     518            self.MakeModal(False)             
     519            self.Destroy()
     520           
     521        def GetData(self):
     522                return self.data
     523       
    471524    class SumDialog(wx.Dialog):
    472525        def __init__(self,parent,title,text,type,data):
     
    710763                            Data['pixLimit'] = 20
    711764                            Data['ellipses'] = []
    712                             Data['masks'] = []
    713765                            Data['calibrant'] = ''
    714766                            self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='Image Controls'),Data)                                           
  • trunk/GSASIIIO.py

    r62 r63  
    649649                if Data['setDefault']:
    650650                    self.imageDefault = Data
     651                #temporary fix to add masks
     652                if not G2gd.GetPatternTreeItemId(self,Id, 'Masks'):
     653                    Imin,Imax = Data['range'][0]
     654                    Masks = {'Points':[],'Rings':[],'Arcs':[],'Polygons':[],'Thresholds':[(Imin,Imax),[Imin,Imax]]}
     655                    self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='Masks'),Masks)
     656                #end of temporary fix
    651657               
    652658        file.close()
     
    689695            wx.EndBusyCursor()
    690696        print 'project save successful'
    691 
     697       
     698def SaveIntegration(self,PickId,data):
     699    azms = self.Integrate[1]
     700    X = self.Integrate[2].flatten()[:-1]
     701    Xminmax = [X[0],X[-1]]
     702    N = len(X)
     703    Id = self.PatternTree.GetItemParent(PickId)
     704    name = self.PatternTree.GetItemText(Id)
     705    name = name.replace('IMG ','PWDR ')
     706    Comments = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,Id, 'Comments'))
     707    names = ['Type','Lam','Zero','Polariz.','U','V','W','X','Y','SH/L','Azimuth']
     708    codes = [0 for i in range(11)]
     709    parms = ['PXC',data['wavelength'],0.0,0.0,1.0,-1.0,0.3,0.0,1.0,0.0,0.0]
     710    Azms = [(azms[i+1]+azms[i])/2. for i in range(len(azms)-1)]
     711    for i,azm in enumerate(Azms):
     712        name += " Azm= %.2f"%(azm)
     713        item, cookie = self.PatternTree.GetFirstChild(self.root)
     714        Id = 0
     715        while item:
     716            Name = self.PatternTree.GetItemText(item)
     717            if name in Name:
     718                Id = item
     719            item, cookie = self.PatternTree.GetNextChild(self.root, cookie)
     720        parms[10] = azm
     721        Y = self.Integrate[0][i].flatten()
     722        W = np.sqrt(Y)
     723        if Id:
     724            self.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(self,Id, 'Comments'),Comments)                   
     725            self.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(self,Id,'Limits'),[tuple(Xminmax),Xminmax])
     726            self.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(self,Id,'Background'),[['chebyschev',1,3,1.0,0.0,0.0]])
     727            self.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(self,Id,'Instrument Parameters'),[tuple(parms),parms,codes,names])
     728            self.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(self,Id,'Peak List'),[])
     729            self.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(self,Id,'Index Peak List'),[])
     730            self.PatternTree.SetItemPyData(G2gd.GetPatternTreeItemId(self,Id,'Unit Cells List'),[])             
     731        else:
     732            Id = self.PatternTree.AppendItem(parent=self.root,text=name)
     733            self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='Comments'),Comments)                   
     734            self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='Limits'),[tuple(Xminmax),Xminmax])
     735            self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='Background'),[['chebyschev',1,3,1.0,0.0,0.0]])
     736            self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='Instrument Parameters'),[tuple(parms),parms,codes,names])
     737            self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='Peak List'),[])
     738            self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='Index Peak List'),[])
     739            self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='Unit Cells List'),[])             
     740        self.PatternTree.SetItemPyData(Id,[[''],[np.array(X),np.array(Y),np.array(W),np.zeros(N),np.zeros(N),np.zeros(N)]])
     741    self.PatternTree.SelectItem(Id)
     742    self.PatternTree.Expand(Id)
     743    self.PatternId = Id
     744           
    692745def powderFxyeSave(self,powderfile):
    693746    file = open(powderfile,'w')
  • trunk/GSASIIcomp.py

    r62 r63  
    13261326    w2 = w*2
    13271327    size = len(image)
    1328     if (w < Xpix < size-w) and (w < Ypix < size-w) and image[Ypix,Xpix]:
    1329         Z = image[Ypix-w:Ypix+w,Xpix-w:Xpix+w]
     1328    xpix = int(Xpix)            #get reference corner of pixel chosen
     1329    ypix = int(Ypix)
     1330    if (w < xpix < size-w) and (w < ypix < size-w) and image[ypix,xpix]:
     1331        Z = image[ypix-w:ypix+w,xpix-w:xpix+w]
    13301332        Zmax = np.argmax(Z)
    13311333        Zmin = np.argmin(Z)
    1332         Xpix += Zmax%w2-w
    1333         Ypix += Zmax/w2-w
    1334         return Xpix,Ypix,np.ravel(Z)[Zmax],np.ravel(Z)[Zmin]
     1334        xpix += Zmax%w2-w
     1335        ypix += Zmax/w2-w
     1336        return xpix,ypix,np.ravel(Z)[Zmax],np.ravel(Z)[Zmin]
    13351337    else:
    13361338        return 0,0,0,0
     
    13481350        X,Y,I,J = ImageLocalMax(image,pix,X,Y)     
    13491351        if I and J and I/J > reject:
     1352            X += .5                             #set to center of pixel
     1353            Y += .5
    13501354            X /= scalex                         #convert to mm
    13511355            Y /= scaley
     
    16351639    return True
    16361640   
    1637 def ImageIntegrate(self,data):
    1638     import matplotlib as mpl
    1639     import numpy.ma as ma
    1640     print 'image integrate'
     1641def Make2ThetaAzimuthMap(data,imageN):
     1642    #transforms 2D image from x,y space to 2-theta,azimuth space based on detector orientation
    16411643    pixelSize = data['pixelSize']
    16421644    scalex = pixelSize[0]/1000.
    16431645    scaley = pixelSize[1]/1000.
     1646    tax,tay = np.mgrid[0.5:imageN+.5,0.5:imageN+.5]         #bin centers not corners
     1647    tax = np.asfarray(tax*scalex,dtype=np.float32)
     1648    tay = np.asfarray(tay*scaley,dtype=np.float32)
     1649    return GetTthAzm(tay,tax,data)           #2-theta & azimuth arrays
     1650
     1651def Fill2ThetaAzimuthMap(data,TA,image):
     1652    import numpy.ma as ma
    16441653    LUtth = data['IOtth']
    16451654    if data['fullIntegrate']:
     
    16471656    else:
    16481657        LRazm = data['LRazimuth']
    1649     numAzms = data['outAzimuths']
    1650     numChans = data['outChannels']
    1651     imageN = len(self.ImageZ)
    1652     t0 = time.time()
    1653     print 'Create ',imageN,' X ',imageN,' 2-theta,azimuth map'
    1654     tax,tay = np.mgrid[0:imageN,0:imageN]
    1655     tax = np.asfarray(tax*scalex,dtype=np.float32)
    1656     tay = np.asfarray(tay*scaley,dtype=np.float32)
    1657     t1 = time.time()
    1658     print "Elapsed time:","%8.3f"%(t1-t0), "s"
    1659     print 'Fill map with 2-theta/azimuth values'
    1660     TA = GetTthAzm(tay,tax,data)           #2-theta & azimuth arrays
    1661     del tax,tay
     1658    imageN = len(image)
    16621659    TA = np.reshape(TA,(2,imageN,imageN))
    16631660    TA = np.dstack((ma.getdata(TA[1]),ma.getdata(TA[0])))    #azimuth, 2-theta
    1664     t2 = time.time()
    16651661    tax,tay = np.dsplit(TA,2)    #azimuth, 2-theta
    16661662    tax = ma.masked_outside(tax.flatten(),LRazm[0],LRazm[1])
    16671663    tay = ma.masked_outside(tay.flatten(),LUtth[0],LUtth[1])
    16681664    tam = ma.getmask(tax)+ma.getmask(tay)
    1669     taz = ma.masked_where(tam,self.ImageZ.flatten())
    1670     G2plt.PlotTRImage(self,np.reshape(tax,(imageN,imageN)),
    1671         np.reshape(tay,(imageN,imageN)),np.reshape(taz,(imageN,imageN)),newPlot=True)
    1672     del TA
    1673     print "Elapsed time:","%8.3f"%(t2-t1), "s"
    1674     print 'Form 1-D histograms for ',numAzms,' azimuthal angles'
    1675     print 'Integration limits:',LUtth,LRazm
     1665    taz = ma.masked_where(tam,image.flatten())
     1666    return tax,tay,taz,tam
     1667   
     1668def Bin2ThetaAzimuthMap(data,tax,tay,taz):
     1669    import numpy.ma as ma
     1670    LUtth = data['IOtth']
     1671    if data['fullIntegrate']:
     1672        LRazm = [-180,180]
     1673    else:
     1674        LRazm = data['LRazimuth']
     1675    numAzms = data['outAzimuths']
     1676    numChans = data['outChannels']
    16761677    NST = np.histogram2d(tax,tay,normed=False,bins=(numAzms,numChans),range=[LRazm,LUtth])
    16771678    HST = np.histogram2d(tax,tay,normed=False,bins=(numAzms,numChans),range=[LRazm,LUtth],weights=taz)
    1678     del tax,tay,taz
    1679     t3 = time.time()
    1680     print "Elapsed time:","%8.3f"%(t3-t2), "s"
    1681     self.Integrate = [HST[0]/NST[0],HST[1],HST[2]]
    1682     del NST,HST
    1683     G2plt.PlotIntegration(self,newPlot=True)
    1684    
    1685        
     1679    return NST,HST
     1680
     1681def ImageIntegrate(self,data):
     1682    dlg = wx.ProgressDialog("Elapsed time","2D image integration",5,
     1683        style = wx.PD_ELAPSED_TIME|wx.PD_AUTO_HIDE)
     1684    try:
     1685        print 'Begin image integration'
     1686        print 'Create 2-theta,azimuth map'
     1687        t0 = time.time()
     1688        dlg.Update(0)
     1689        imageN = len(self.ImageZ)
     1690        TA = Make2ThetaAzimuthMap(data,imageN)           #2-theta & azimuth arrays
     1691        dlg.Update(1)
     1692        print 'Fill map with 2-theta/azimuth values'
     1693        tax,tay,taz,tam = Fill2ThetaAzimuthMap(data,TA,self.ImageZ)
     1694        del TA
     1695        dlg.Update(2)
     1696        print 'Bin image by 2-theta/azimuth intervals'
     1697        NST,HST = Bin2ThetaAzimuthMap(data,tax,tay,taz)
     1698        del tax,tay,taz
     1699        dlg.Update(3)
     1700        print 'Form normalized 1D pattern(s)'
     1701        self.Integrate = [HST[0]/NST[0],HST[1],HST[2]]
     1702        del NST,HST
     1703        dlg.Update(4)
     1704        t1 = time.time()
     1705        print 'Integration complete'
     1706        print "Elapsed time:","%8.3f"%(t1-t0), "s"
     1707    finally:
     1708        dlg.Destroy()
     1709       
    16861710def test():
    16871711    cell = [5,5,5,90,90,90]
  • trunk/GSASIIgrid.py

    r62 r63  
    1010import GSASIIElem as G2elem
    1111import GSASIIplot as G2plt
     12import GSASIIIO as G2IO
    1213
    1314# trig functions in degrees
     
    2021] = [wx.NewId() for _init_coll_Atom_Items in range(2)]
    2122
    22 [ wxID_IMCALIBRATE, wxID_IMINTEGRATE, wxID_IMCLEARCALIB, wxID_SAVEINTG
    23 ] = [wx.NewId() for _init_coll_IMAGE_Items in range(4)]
     23[ wxID_IMCALIBRATE, wxID_IMINTEGRATE, wxID_IMCLEARCALIB, wxID_SAVEINTG,
     24    wxID_IMCOPYCONTROLS, wxID_INTEGRATEALL,
     25] = [wx.NewId() for _init_coll_IMAGE_Items in range(6)]
     26
     27[ wxID_MASKCOPY,
     28] = [wx.NewId() for _init_coll_MASK_Items in range(1)]
    2429
    2530[ wxID_UNDO,wxID_PEAKFIT,wxID_AUTOPEAKFIT,
     
    3843    def _init_coll_ImageMenu(self,parent):
    3944        parent.Append(menu=self.ImageEdit, title='Image Operations')
     45       
     46    def _init_coll_MaskMenu(self,parent):
     47        parent.Append(menu=self.MaskEdit, title='Mask Operations')
    4048       
    4149    def _init_coll_PeakMenu(self,parent):
     
    5159           
    5260    def _init_coll_Image_Items(self,parent):
    53         parent.Append(help='Calibrate detector by fitting to calibrant lines', \
     61        parent.Append(help='Calibrate detector by fitting to calibrant lines',
    5462            id=wxID_IMCALIBRATE, kind=wx.ITEM_NORMAL,text='Calibrate')
    55         parent.Append(help='Clear calibration data points and rings',id=wxID_IMCLEARCALIB, \
     63        parent.Append(help='Clear calibration data points and rings',id=wxID_IMCLEARCALIB,
    5664            kind=wx.ITEM_NORMAL,text='Clear calibration')
    57         parent.Append(help='',id=wxID_IMINTEGRATE, kind=wx.ITEM_NORMAL,text='Integrate')
    58         parent.Append(help='Save integration results as a series of 1-D powder patterns', \
     65        parent.Append(help='Integrate selected image',id=wxID_IMINTEGRATE,
     66            kind=wx.ITEM_NORMAL,text='Integrate')
     67        parent.Append(help='Integrate all images selected from list',id=wxID_INTEGRATEALL,
     68            kind=wx.ITEM_NORMAL,text='Integrate all')
     69        parent.Append(help='Save integration results as a series of 1-D powder patterns',
    5970            id=wxID_SAVEINTG, kind=wx.ITEM_NORMAL,text='Save Integration')
     71        parent.Append(help='Copy image controls to other images',
     72            id=wxID_IMCOPYCONTROLS, kind=wx.ITEM_NORMAL,text='Copy Controls')
    6073                   
     74    def _init_coll_Mask_Items(self,parent):
     75        parent.Append(help='Copy mask to other images',
     76            id=wxID_MASKCOPY, kind=wx.ITEM_NORMAL,text='Copy mask')
     77
    6178    def _init_coll_Peak_Items(self,parent):
    62         self.UnDo = parent.Append(help='Undo last least squares refinement', \
     79        self.UnDo = parent.Append(help='Undo last least squares refinement',
    6380            id=wxID_UNDO, kind=wx.ITEM_NORMAL,text='UnDo')
    64         self.PeakFit = parent.Append(id=wxID_PEAKFIT, kind=wx.ITEM_NORMAL,text='PeakFit', \
     81        self.PeakFit = parent.Append(id=wxID_PEAKFIT, kind=wx.ITEM_NORMAL,text='PeakFit',
    6582            help='Do single cycle of peak fitting least-squares refinement' )
    66         self.AutoPeakFit = parent.Append(id=wxID_AUTOPEAKFIT, kind=wx.ITEM_NORMAL, \
     83        self.AutoPeakFit = parent.Append(id=wxID_AUTOPEAKFIT, kind=wx.ITEM_NORMAL,
    6784            text='AutoPeakFit',help='Do peak fitting least-squares to convergence' )
    6885           
     
    7087        self.IndexPeaks = parent.Append(help='', id=wxID_INDEXPEAKS, kind=wx.ITEM_NORMAL,
    7188            text='Index Cell')
    72         self.CopyCell = parent.Append( id=wxID_COPYCELL, kind=wx.ITEM_NORMAL,text='Copy Cell', \
     89        self.CopyCell = parent.Append( id=wxID_COPYCELL, kind=wx.ITEM_NORMAL,text='Copy Cell',
    7390            help='Copy selected unit cell from indexing to cell refinement fields')
    74         self.RefineCell = parent.Append( id=wxID_REFINECELL, kind=wx.ITEM_NORMAL, \
     91        self.RefineCell = parent.Append( id=wxID_REFINECELL, kind=wx.ITEM_NORMAL,
    7592            text='Refine Cell',help='Refine unit cell parameters from indexed peaks')
    7693
     
    8097        self.AtomsMenu = wx.MenuBar()
    8198        self.ImageMenu = wx.MenuBar()
     99        self.MaskMenu = wx.MenuBar()
    82100        self.PeakMenu = wx.MenuBar()
    83101        self.IndexMenu = wx.MenuBar()
    84102        self.AtomEdit = wx.Menu(title='')
    85103        self.ImageEdit = wx.Menu(title='')
     104        self.MaskEdit = wx.Menu(title='')
    86105        self.PeakEdit = wx.Menu(title='')
    87106        self.IndexEdit = wx.Menu(title='')
     
    90109        self._init_coll_ImageMenu(self.ImageMenu)
    91110        self._init_coll_Image_Items(self.ImageEdit)
     111        self._init_coll_MaskMenu(self.MaskMenu)
     112        self._init_coll_Mask_Items(self.MaskEdit)
    92113        self._init_coll_PeakMenu(self.PeakMenu)
    93114        self._init_coll_Peak_Items(self.PeakEdit)
     
    275296                self.data[row][col] = value
    276297        innerSetValue(row, col, value)
    277        
    278298       
    279299def UpdateNotebook(self,data):       
     
    11341154       
    11351155    def OnMaxSlider(event):
    1136         imax = int(maxSel.GetValue())
    1137         delt = data['range'][0][1]-data['range'][0][0]
    1138         data['range'][1][1] = max(data['range'][1][0]+1,int((imax/100.)*delt)+data['range'][0][0])
     1156        logDeltZero = math.log(data['range'][0][1]-data['range'][0][0])
     1157        imax = int(maxSel.GetValue())*logDeltZero/100.
     1158        data['range'][1][1] = math.exp(imax)+data['range'][0][0]
     1159        data['range'][1][0] = min(data['range'][1][1]-1,data['range'][1][0])
    11391160        G2plt.PlotExposedImage(self)
    11401161       
    11411162    def OnMinSlider(event):
    1142         imin = int(minSel.GetValue())
    1143         delt = data['range'][1][1]-data['range'][0][0]
    1144         data['range'][1][0] = min(data['range'][1][1]-1,int((imin/100.)*delt)+data['range'][0][0])
     1163        DeltOne = data['range'][1][1]-data['range'][0][0]
     1164        imin = int(minSel.GetValue())*DeltOne/100.
     1165        data['range'][1][0] = min(data['range'][1][1]-1,imin+data['range'][0][0])
    11451166        G2plt.PlotExposedImage(self)
    11461167       
     
    12441265        data['ellipses'] = []
    12451266        self.dataFrame.ImageEdit.Enable(id=wxID_IMCLEARCALIB,enable=False)   
    1246         G2plt.PlotImage(self)
     1267        G2plt.PlotExposedImage(self)
    12471268           
    12481269    def OnCalibrate(event):       
     
    12721293    def OnIntegrate(event):
    12731294        G2cmp.ImageIntegrate(self,data)
    1274         self.dataFrame.ImageEdit.Enable(id=wxID_SAVEINTG,enable=True)   
     1295        G2plt.PlotIntegration(self,newPlot=True)
     1296        self.dataFrame.ImageEdit.Enable(id=wxID_SAVEINTG,enable=True)
     1297       
     1298    def OnIntegrateAll(event):
     1299        print 'integrate all'
    12751300       
    12761301    def OnSaveIntegrate(event):
    1277         import numpy as np
    12781302        print 'save integration'
    1279         azms = self.Integrate[1]
    1280         X = self.Integrate[2].flatten()[:-1]
    1281         Xminmax = [X[0],X[-1]]
    1282         N = len(X)
    1283         Id = self.PatternTree.GetItemParent(self.PickId)
    1284         name = self.PatternTree.GetItemText(Id)
    1285         Comments = self.PatternTree.GetItemPyData(GetPatternTreeItemId(self,Id, 'Comments'))
    1286         name = name.replace('IMG ','PWDR ')
    1287         names = ['Type','Lam','Zero','Polariz.','U','V','W','X','Y','SH/L','Azimuth']
    1288         codes = [0 for i in range(11)]
    1289         parms = ['PXC',data['wavelength'],0.0,0.0,1.0,-1.0,0.3,0.0,1.0,0.0,0.0]
    1290         Azms = [(azms[i+1]+azms[i])/2. for i in range(len(azms)-1)]
    1291         for i,azm in enumerate(Azms):
    1292             Id = self.PatternTree.AppendItem(parent=self.root,text=name+"Azm= %.2f"%(azm))
    1293             parms[10] = azm
    1294             Y = self.Integrate[0][i].flatten()
    1295             W = np.sqrt(Y)
    1296             self.PatternTree.SetItemPyData(Id,[[''],[np.array(X),np.array(Y),np.array(W),np.zeros(N),np.zeros(N),np.zeros(N)]])
    1297             self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='Comments'),Comments)                   
    1298             self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='Limits'),[tuple(Xminmax),Xminmax])
    1299             self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='Background'),[['chebyschev',1,3,1.0,0.0,0.0]])
    1300             self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='Instrument Parameters'),[tuple(parms),parms,codes,names])
    1301             self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='Peak List'),[])
    1302             self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='Index Peak List'),[])
    1303             self.PatternTree.SetItemPyData(self.PatternTree.AppendItem(Id,text='Unit Cells List'),[])             
    1304         self.PatternTree.SelectItem(Id)
    1305         self.PatternTree.Expand(Id)
    1306         self.PatternId = Id
     1303        G2IO.SaveIntegration(self,self.PickId,data)
    13071304           
    1308                                
     1305    def OnCopyControls(event):
     1306        TextList = []
     1307        Names = []
     1308        if self.PatternTree.GetCount():
     1309            id, cookie = self.PatternTree.GetFirstChild(self.root)
     1310            while id:
     1311                name = self.PatternTree.GetItemText(id)
     1312                Names.append(name)
     1313                if 'IMG' in name:
     1314                    if id == self.Image:
     1315                        Source = name
     1316                        Data = self.PatternTree.GetItemPyData(GetPatternTreeItemId(self,id, 'Image Controls'))
     1317                        Data['showLines'] = True
     1318                        Data['ring'] = []
     1319                        Data['rings'] = []
     1320                        Data['cutoff'] = 10
     1321                        Data['pixLimit'] = 20
     1322                        Data['ellipses'] = []
     1323                        Data['calibrant'] = ''
     1324                        Data['setDefault'] = False
     1325                    else:
     1326                        TextList.append([False,name,id])
     1327                id, cookie = self.PatternTree.GetNextChild(self.root, cookie)
     1328            if not len(TextList):
     1329                self.ErrorDialog('Nothing to copy controls to','There must be more than one "IMG" pattern')
     1330                return
     1331            dlg = self.CopyDialog(self,'Copy image controls','Copy controls from '+Source+' to:',TextList)
     1332            try:
     1333                if dlg.ShowModal() == wx.ID_OK:
     1334                    result = dlg.GetData()
     1335                    for i,item in enumerate(result[:-1]):
     1336                        ifcopy,name,id = item
     1337                        if ifcopy:
     1338                            oldData = self.PatternTree.GetItemPyData(GetPatternTreeItemId(self,id, 'Image Controls'))
     1339                            Data['range'] = oldData['range']                               
     1340                            self.PatternTree.SetItemPyData(GetPatternTreeItemId(self,id, 'Image Controls'),Data)
     1341            finally:
     1342                dlg.Destroy()
     1343                                       
    13091344    colorList = [m for m in mpl.cm.datad.keys() if not m.endswith("_r")]
    13101345    calList = [m for m in calFile.Calibrants.keys()]
     
    13191354        self.dataFrame.ImageEdit.Enable(id=wxID_IMCLEARCALIB,enable=False)   
    13201355    self.dataFrame.Bind(wx.EVT_MENU, OnIntegrate, id=wxID_IMINTEGRATE)
     1356    self.dataFrame.Bind(wx.EVT_MENU, OnIntegrateAll, id=wxID_INTEGRATEALL)
    13211357    self.dataFrame.Bind(wx.EVT_MENU, OnSaveIntegrate, id=wxID_SAVEINTG)
     1358    self.dataFrame.Bind(wx.EVT_MENU, OnCopyControls, id=wxID_IMCOPYCONTROLS)
    13221359    self.dataFrame.ImageEdit.Enable(id=wxID_SAVEINTG,enable=False)   
    13231360    self.dataDisplay = wx.Panel(self.dataFrame)
     
    13271364    maxSizer = wx.FlexGridSizer(2,2,0,5)
    13281365    maxSizer.AddGrowableCol(1,1)
     1366    logDeltZero = math.log(data['range'][0][1]-data['range'][0][0])
     1367    DeltOne = data['range'][1][1]-data['range'][0][0]
     1368    logDeltOne = math.log(DeltOne)
    13291369    maxSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Max intensity'),0,
    13301370        wx.ALIGN_CENTER_VERTICAL|wx.EXPAND)
    13311371    maxSel = wx.Slider(parent=self.dataDisplay,style=wx.SL_HORIZONTAL,
    1332         value=int(100*data['range'][1][1]/(data['range'][0][1]-data['range'][0][0])))
     1372        value=int(100*logDeltOne/logDeltZero))
    13331373    maxSizer.Add(maxSel,1,wx.EXPAND|wx.RIGHT)
    13341374    maxSel.Bind(wx.EVT_SLIDER, OnMaxSlider)   
     
    13361376        wx.ALIGN_CENTER_VERTICAL|wx.EXPAND)
    13371377    minSel = wx.Slider(parent=self.dataDisplay,style=wx.SL_HORIZONTAL,
    1338         value=int(100*data['range'][1][0]/(data['range'][1][1]-data['range'][0][0])))
     1378        value=int(100*data['range'][1][0]/DeltOne))
    13391379    maxSizer.Add(minSel,1,wx.EXPAND|wx.RIGHT)
    13401380    minSel.Bind(wx.EVT_SLIDER, OnMinSlider)
     
    13881428        wx.ALIGN_CENTER_VERTICAL)
    13891429       
    1390     #temporary fixes   
    1391     if 'IOtth' not in data:                 
    1392         del data['IOradii']
    1393         data['IOtth'] = [2.0,5.0]
    1394     if 'outAzimuths' not in data:
    1395         data['outAzimuths'] = 1       
    1396        
    13971430    IOtth = data['IOtth']
    13981431    littleSizer = wx.BoxSizer(wx.HORIZONTAL)
     
    14111444    waveSel = wx.TextCtrl(parent=self.dataDisplay,value=("%6.5f" % (data['wavelength'])),
    14121445        style=wx.TE_PROCESS_ENTER)
    1413     waveSel.Bind(wx.EVT_TEXT,OnWavelength)
     1446    waveSel.Bind(wx.EVT_TEXT_ENTER,OnWavelength)
    14141447    dataSizer.Add(waveSel,0,wx.ALIGN_CENTER_VERTICAL)
    14151448         
     
    14371470    littleSizer = wx.BoxSizer(wx.HORIZONTAL)
    14381471    outChan = wx.TextCtrl(parent=self.dataDisplay,value=str(data['outChannels']),style=wx.TE_PROCESS_ENTER)
    1439     outChan.Bind(wx.EVT_TEXT,OnNumOutChans)
     1472    outChan.Bind(wx.EVT_TEXT_ENTER,OnNumOutChans)
    14401473    littleSizer.Add(outChan,0,wx.ALIGN_CENTER_VERTICAL)
    14411474    outAzim = wx.TextCtrl(parent=self.dataDisplay,value=str(data['outAzimuths']),style=wx.TE_PROCESS_ENTER)
    1442     outAzim.Bind(wx.EVT_TEXT,OnNumOutAzms)
     1475    outAzim.Bind(wx.EVT_TEXT_ENTER,OnNumOutAzms)
    14431476    littleSizer.Add(outAzim,0,wx.ALIGN_CENTER_VERTICAL)
    14441477    dataSizer.Add(littleSizer,0,)
     
    14761509    self.dataDisplay.SetSize(mainSizer.Fit(self.dataFrame))
    14771510    self.dataFrame.setSizePosLeft(mainSizer.Fit(self.dataFrame))
     1511   
     1512def UpdateMasks(self,data):
     1513   
     1514    def OnThreshold(event):
     1515        lower = max(int(self.lowerThreshold.GetValue()),thresh[0][0])
     1516        upper = min(int(self.upperThreshold.GetValue()),thresh[0][1])
     1517        data['Thresholds'][1] = [lower,upper]
     1518        self.lowerThreshold.SetValue("%8d" % (lower))
     1519        self.upperThreshold.SetValue("%8d" % (upper))
     1520        G2plt.PlotExposedImage(self)
     1521       
     1522    def OnCopyMask(event):
     1523        TextList = []
     1524        Names = []
     1525        if self.PatternTree.GetCount():
     1526            id, cookie = self.PatternTree.GetFirstChild(self.root)
     1527            while id:
     1528                name = self.PatternTree.GetItemText(id)
     1529                Names.append(name)
     1530                if 'IMG' in name:
     1531                    if id == self.Image:
     1532                        Source = name
     1533                        mask = self.PatternTree.GetItemPyData(GetPatternTreeItemId(self,id, 'Masks'))
     1534                    else:
     1535                        TextList.append([False,name,id])
     1536                id, cookie = self.PatternTree.GetNextChild(self.root, cookie)
     1537            if not len(TextList):
     1538                self.ErrorDialog('Nothing to copy mask to','There must be more than one "IMG" pattern')
     1539                return
     1540            dlg = self.CopyDialog(self,'Copy mask information','Copy mask from '+Source+' to:',TextList)
     1541            try:
     1542                if dlg.ShowModal() == wx.ID_OK:
     1543                    result = dlg.GetData()
     1544                    for i,item in enumerate(result[:-1]):
     1545                        ifcopy,name,id = item
     1546                        if ifcopy:                               
     1547                            self.PatternTree.SetItemPyData(GetPatternTreeItemId(self,id, 'Masks'),mask)
     1548            finally:
     1549                dlg.Destroy()
     1550       
     1551    if self.dataDisplay:
     1552        self.dataDisplay.Destroy()
     1553    self.dataFrame.SetMenuBar(self.dataFrame.MaskMenu)
     1554    self.dataFrame.Bind(wx.EVT_MENU, OnCopyMask, id=wxID_MASKCOPY)
     1555    if not self.dataFrame.GetStatusBar():
     1556        Status = self.dataFrame.CreateStatusBar()
     1557    self.dataDisplay = wx.Panel(self.dataFrame)
     1558    mainSizer = wx.BoxSizer(wx.VERTICAL)
     1559    mainSizer.Add((5,10),0)
     1560
     1561    thresh = data['Thresholds']
     1562    littleSizer = wx.FlexGridSizer(2,3,0,5)
     1563    littleSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Lower/Upper limits '),0,
     1564        wx.ALIGN_CENTER_VERTICAL)
     1565    littleSizer.Add(wx.TextCtrl(parent=self.dataDisplay,
     1566        value=("%8d" % (thresh[0][0])),style=wx.TE_READONLY),0,wx.ALIGN_CENTER_VERTICAL)
     1567    littleSizer.Add(wx.TextCtrl(parent=self.dataDisplay,
     1568        value=("%8d" % (thresh[0][1])),style=wx.wx.TE_READONLY),0,wx.ALIGN_CENTER_VERTICAL)
     1569   
     1570    littleSizer.Add(wx.StaticText(parent=self.dataDisplay,label=' Lower/Upper thresholds '),0,
     1571        wx.ALIGN_CENTER_VERTICAL)
     1572    self.lowerThreshold = wx.TextCtrl(parent=self.dataDisplay,
     1573        value=("%8d" % (thresh[1][0])),style=wx.TE_PROCESS_ENTER)
     1574    self.lowerThreshold.Bind(wx.EVT_TEXT_ENTER,OnThreshold)
     1575    littleSizer.Add(self.lowerThreshold,0,wx.ALIGN_CENTER_VERTICAL)
     1576    self.upperThreshold = wx.TextCtrl(parent=self.dataDisplay,
     1577        value=("%8d" % (thresh[1][1])),style=wx.TE_PROCESS_ENTER)
     1578    self.upperThreshold.Bind(wx.EVT_TEXT_ENTER,OnThreshold)
     1579    littleSizer.Add(self.upperThreshold,0,wx.ALIGN_CENTER_VERTICAL)
     1580    mainSizer.Add(littleSizer,0,)
     1581       
     1582
     1583
     1584    mainSizer.Layout()   
     1585    self.dataDisplay.SetSizer(mainSizer)
     1586    self.dataDisplay.SetSize(mainSizer.Fit(self.dataFrame))
     1587    self.dataFrame.setSizePosLeft(mainSizer.Fit(self.dataFrame))   
    14781588   
    14791589def UpdatePhaseData(self,item,data,oldPage):
     
    18801990        elif 'IMG' in self.PatternTree.GetItemText(item):
    18811991            self.Image = item
    1882             self.Img = 0
    18831992            G2plt.PlotImage(self,newPlot=True)
    18841993        elif 'PKS' in self.PatternTree.GetItemText(item):
     
    19062015        data = self.PatternTree.GetItemPyData(item)
    19072016        UpdateImageControls(self,data)
     2017        G2plt.PlotImage(self)
     2018    elif self.PatternTree.GetItemText(item) == 'Masks':
     2019        self.dataFrame.SetTitle('Masks')
     2020        self.PickId = item
     2021        self.Image = self.PatternTree.GetItemParent(item)
     2022        data = self.PatternTree.GetItemPyData(item)
     2023        UpdateMasks(self,data)
    19082024        G2plt.PlotImage(self)
    19092025    elif self.PatternTree.GetItemText(item) == 'HKL Plot Controls':
  • trunk/GSASIIplot.py

    r62 r63  
    244244            else:
    245245                self.Contour = True
    246         else:
    247             event.Skip(True)
    248246        PlotPatterns(self)
    249247                       
     
    389387    if self.Contour:
    390388        acolor = mpl.cm.get_cmap('Paired')
    391         Plot.contourf(ContourX,ContourY,ContourZ,cmap=acolor)
    392         Plot.set_ylim(0,Nseq-1)
     389        Plot.imshow(ContourZ,cmap=acolor,vmin=0,vmax=Ymax,interpolation='nearest',
     390            extent=[ContourX[0],ContourX[-1],ContourY[0],ContourY[-1]],aspect='auto')
    393391        newPlot = True
    394392    else:
     
    403401    else:
    404402        Page.canvas.draw()
    405 
    406    
    407403    self.Pwdr = True
    408404
     
    524520    Plot.legend(loc='best')
    525521    Page.canvas.draw()
     522           
     523def PlotExposedImage(self,newPlot=False):
     524    plotNo = self.G2plotNB.nb.GetSelection()
     525    if self.G2plotNB.nb.GetPageText(plotNo) == '2D Powder Image':
     526        PlotImage(self,newPlot)
     527    elif self.G2plotNB.nb.GetPageText(plotNo) == '2D Integration':
     528        PlotIntegration(self,newPlot)
    526529
    527530def PlotImage(self,newPlot=False):
     
    602605                    xpos,ypos,I,J = G2cmp.ImageLocalMax(self.ImageZ,20,Xpix,Ypix)
    603606                    if I and J:
    604                         xpos /= scalex
     607                        xpos += .5                              #shift to pixel center
     608                        ypos += .5
     609                        xpos /= scalex                          #convert to mm
    605610                        ypos /= scaley
    606611                        Data['ring'].append([xpos,ypos])
     
    667672        self.ImageZ = G2IO.GetImageData(imagefile,imageOnly=True)
    668673        self.oldImagefile = imagefile
    669     Data = self.PatternTree.GetItemPyData( \
     674    Data = self.PatternTree.GetItemPyData(
    670675        G2gd.GetPatternTreeItemId(self,self.Image, 'Image Controls'))
     676    try:
     677        Masks = self.PatternTree.GetItemPyData(
     678            G2gd.GetPatternTreeItemId(self,self.Image, 'Masks'))
     679    except TypeError:       #missing Masks
     680        Masks = {}
    671681    imScale = 1
    672682    if len(self.ImageZ) > 1024:
     
    684694    Plot.set_xlabel('Image x-axis, mm',fontsize=12)
    685695    Plot.set_ylabel('Image y-axis, mm',fontsize=12)
     696    #need "applyMask" routine here
    686697    A = G2cmp.ImageCompress(self.ImageZ,imScale)
    687     self.Img = Plot.imshow(A,aspect='equal',cmap=acolor, \
     698    Img = Plot.imshow(A,aspect='equal',cmap=acolor,
    688699        interpolation='nearest',vmin=Imin,vmax=Imax,extent=[0,Xmax,Xmax,0])
    689700
     
    728739        Plot.add_artist(Ellipse([cent[0],cent[1]],2*width,2*height,phi,ec=col,fc='none'))
    729740        Plot.text(cent[0],cent[1],'+',color=col,ha='center',va='center')
    730     colorBar = Page.figure.colorbar(self.Img)
     741    colorBar = Page.figure.colorbar(Img)
    731742    Plot.set_xlim(xlim)
    732743    Plot.set_ylim(ylim)
     
    740751    else:
    741752        Page.canvas.draw()
     753       
     754def PlotIntegration(self,newPlot=False):
    742755           
     756    def OnMotion(event):
     757        Page.canvas.SetToolTipString('')
     758        Page.canvas.SetCursor(wx.CROSS_CURSOR)
     759        azm = event.ydata
     760        tth = event.xdata
     761        if azm and tth:
     762            self.G2plotNB.status.SetFields(\
     763                ['Detector 2-th =%9.3fdeg, azm = %7.2fdeg'%(tth,azm),])
     764                               
     765    try:
     766        plotNum = self.G2plotNB.plotList.index('2D Integration')
     767        Page = self.G2plotNB.nb.GetPage(plotNum)
     768        if not newPlot:
     769            Plot = Page.figure.gca()          #get previous plot & get limits
     770            xylim = Plot.get_xlim(),Plot.get_ylim()
     771        Page.figure.clf()
     772        Plot = Page.figure.gca()          #get a fresh plot after clf()
     773       
     774    except ValueError,error:
     775        Plot = self.G2plotNB.add('2D Integration').gca()
     776        plotNum = self.G2plotNB.plotList.index('2D Integration')
     777        Page = self.G2plotNB.nb.GetPage(plotNum)
     778        Page.canvas.mpl_connect('motion_notify_event', OnMotion)
     779        Page.views = False
     780        view = False
     781    Page.SetFocus()
     782       
     783    Data = self.PatternTree.GetItemPyData(
     784        G2gd.GetPatternTreeItemId(self,self.Image, 'Image Controls'))
     785    image = self.Integrate[0]
     786    xsc = self.Integrate[1]
     787    ysc = self.Integrate[2]
     788    Imin,Imax = Data['range'][1]
     789    acolor = mpl.cm.get_cmap(Data['color'])
     790    Plot.set_title(self.PatternTree.GetItemText(self.Image)[4:])
     791    Plot.set_ylabel('azimuth',fontsize=12)
     792    Plot.set_xlabel('2-theta',fontsize=12)
     793    Img = Plot.imshow(image,cmap=acolor,vmin=Imin,vmax=Imax,interpolation='nearest', \
     794        extent=[ysc[0],ysc[-1],xsc[-1],xsc[0]],aspect='auto')
     795    colorBar = Page.figure.colorbar(Img)
     796    if Data['setRings']:
     797        rings = np.concatenate((Data['rings']),axis=0)
     798        for xring,yring,dsp in rings:
     799            x,y = G2cmp.GetTthAzm(xring,yring,Data)
     800            Plot.plot(x,y,'r+')
     801    if Data['ellipses']:           
     802        for ellipse in Data['ellipses']:
     803            ring = np.array(G2cmp.makeIdealRing(ellipse[:3])) #skip color
     804            x,y = np.hsplit(ring,2)
     805            tth,azm = G2cmp.GetTthAzm(x,y,Data)
     806            Plot.plot(tth,azm,'b,')
     807    if not newPlot:
     808        Page.toolbar.push_current()
     809        Plot.set_xlim(xylim[0])
     810        Plot.set_ylim(xylim[1])
     811        xylim = []
     812        Page.toolbar.push_current()
     813        Page.toolbar.draw()
     814    else:
     815        Page.canvas.draw()
     816       
     817       
    743818def PlotTRImage(self,tax,tay,taz,newPlot=False):
     819    #a test plot routine - not normally used
    744820           
    745821    def OnMotion(event):
     
    770846    Page.SetFocus()
    771847       
    772     Data = self.PatternTree.GetItemPyData( \
     848    Data = self.PatternTree.GetItemPyData(
    773849        G2gd.GetPatternTreeItemId(self,self.Image, 'Image Controls'))
    774850    Imin,Imax = Data['range'][1]
     
    776852    V = np.arange(Imin,Imax,step)
    777853    acolor = mpl.cm.get_cmap(Data['color'])
     854    Plot.set_title(self.PatternTree.GetItemText(self.Image)[4:])
    778855    Plot.set_xlabel('azimuth',fontsize=12)
    779856    Plot.set_ylabel('2-theta',fontsize=12)
     
    795872            x,y = G2cmp.GetTthAzm(xring,yring,Data)
    796873            Plot.plot(y,x,'r+')           
     874    if Data['ellipses']:           
    797875        for ellipse in Data['ellipses']:
    798876            ring = np.array(G2cmp.makeIdealRing(ellipse[:3])) #skip color
     
    810888        Page.canvas.draw()
    811889       
    812 def PlotExposedImage(self,newPlot=False):
    813     plotNo = self.G2plotNB.nb.GetSelection()
    814     if self.G2plotNB.nb.GetPageText(plotNo) == '2D Powder Image':
    815         PlotImage(self,newPlot)
    816     elif self.G2plotNB.nb.GetPageText(plotNo) == '2D Integration':
    817         PlotIntegration(self,newPlot)
    818        
    819 def PlotIntegration(self,newPlot=False):
    820            
    821     def OnMotion(event):
    822         Page.canvas.SetToolTipString('')
    823         Page.canvas.SetCursor(wx.CROSS_CURSOR)
    824         azm = event.ydata
    825         tth = event.xdata
    826         if azm and tth:
    827             self.G2plotNB.status.SetFields(\
    828                 ['Detector 2-th =%9.3fdeg, azm = %7.2fdeg'%(tth,azm),])
    829                                
    830     try:
    831         plotNum = self.G2plotNB.plotList.index('2D Integration')
    832         Page = self.G2plotNB.nb.GetPage(plotNum)
    833         if not newPlot:
    834             Plot = Page.figure.gca()          #get previous plot & get limits
    835             xylim = Plot.get_xlim(),Plot.get_ylim()
    836         Page.figure.clf()
    837         Plot = Page.figure.gca()          #get a fresh plot after clf()
    838        
    839     except ValueError,error:
    840         Plot = self.G2plotNB.add('2D Integration').gca()
    841         plotNum = self.G2plotNB.plotList.index('2D Integration')
    842         Page = self.G2plotNB.nb.GetPage(plotNum)
    843         Page.canvas.mpl_connect('motion_notify_event', OnMotion)
    844         Page.views = False
    845         view = False
    846     Page.SetFocus()
    847        
    848     Data = self.PatternTree.GetItemPyData( \
    849         G2gd.GetPatternTreeItemId(self,self.Image, 'Image Controls'))
    850     image = self.Integrate[0]
    851     xsc = self.Integrate[1]
    852     ysc = self.Integrate[2]
    853     Imin,Imax = Data['range'][1]
    854     acolor = mpl.cm.get_cmap(Data['color'])
    855     Plot.set_ylabel('azimuth',fontsize=12)
    856     Plot.set_xlabel('2-theta',fontsize=12)
    857     Plot.imshow(image,cmap=acolor,vmin=Imin,vmax=Imax,interpolation='nearest', \
    858         extent=[ysc[0],ysc[-1],xsc[-1],xsc[0]],aspect='auto')
    859     if Data['setRings']:
    860         rings = np.concatenate((Data['rings']),axis=0)
    861         for xring,yring,dsp in rings:
    862             x,y = G2cmp.GetTthAzm(xring,yring,Data)
    863             Plot.plot(x,y,'r+')           
    864         for ellipse in Data['ellipses']:
    865             ring = np.array(G2cmp.makeIdealRing(ellipse[:3])) #skip color
    866             x,y = np.hsplit(ring,2)
    867             tth,azm = G2cmp.GetTthAzm(x,y,Data)
    868             Plot.plot(tth,azm,'b,')
    869     if not newPlot:
    870         Page.toolbar.push_current()
    871         Plot.set_xlim(xylim[0])
    872         Plot.set_ylim(xylim[1])
    873         xylim = []
    874         Page.toolbar.push_current()
    875         Page.toolbar.draw()
    876     else:
    877         Page.canvas.draw()
    878        
     890       
Note: See TracChangeset for help on using the changeset viewer.