Changeset 4658


Ignore:
Timestamp:
Nov 18, 2020 7:58:58 PM (13 months ago)
Author:
toby
Message:

implement package version checking; fix broken mpl pick code

Location:
trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/GSASIIdataGUI.py

    r4645 r4658  
    3333        print('Warning: failed to import the optimized Py3 pickle (_pickle)')
    3434        import pickle as cPickle
     35import re
    3536import numpy as np
    3637import numpy.ma as ma
     
    325326    sys.stderr = sys.stdout
    326327
     328def convVersion(version):
     329    '''Convert a version string ("x", "x.y", "x.y.z") into a series of
     330    ints.
     331
     332    :returns: [i0, i1, i2] where None is used if a value is not specified
     333       and 0 is used if a field cannot be parsed.
     334    '''
     335    vIntList = [None,None,None]
     336    for i,v in enumerate(version.split('.')):
     337        if i >= 3: break
     338        if len(v) == 0: break
     339        v = list(filter(None,re.split('(\\d+)',v)))[0]   # conv '1b2' to '1'
     340        try:
     341            vIntList[i] = int(v)
     342        except:
     343            vIntList[i] = 0
     344    return vIntList
     345
     346def compareVersions(version1,version2):
     347    '''Compare two version strings ("x", "x.y", "x.y.z")
     348    Note that '3.' matches '3.1', and '3.0' matches '3.0.1'
     349    but '3.0.0' does not match '3.0.1'
     350
     351    :returns: 0 if the versions match, -1 if version1 < version2,
     352       or 1 if version1 > version2
     353    '''
     354    for v1,v2 in zip(convVersion(version1),convVersion(version2)):
     355        if v1 is None or v2 is None:
     356            return 0
     357        if v1 < v2: return -1
     358        if v1 > v2: return 1
     359    return 0
     360
     361# tabulate package versions that users should be warned about
     362versionDict = {}
     363'''Variable versionDict is used to designate versions of packages that
     364should generate warnings or error messages.
     365
     366* ``versionDict['tooOld']`` is a dict with module versions that are too old and are
     367  known to cause serious errors
     368* ``versionDict['tooOldWarn']`` is a dict with module versions that are
     369  significantly out of date and should be updated, but will probably function OK.
     370* ``versionDict['badVersionWarn']`` is a dict of with lists of package
     371  versions that are known to have bugs. One should select an older or
     372  newer version of the package.
     373* ``versionDict['tooNewWarn']`` is a dict with module versions that have not
     374  been tested but have changes that lead us to believe that errors are
     375  likely to happen.
     376
     377**Packages/versions to be avoided**
     378
     379* wxPython:
     380
     381 * <=2.x.x: while most of GSAS-II has been written to be
     382    compatible with older versions of wxpython, we are now testing with
     383    version 4.0 only. Version 3.0 is pretty similar to 4.0 and should not
     384    have problems.
     385
     386* Matplotlib:
     387
     388  * 1.x: there have been significant API changes since these versions and
     389    significant graphics errors will occur.
     390  * 3.1.x and 3.2.x: these versions have a known bug for plotting
     391    3-D surfaces, such as microstrain vs crystal axes. The plots may appear
     392    distorted as the lengths of x, y & z will not be constrained as equal.
     393    Preferably use 3.0.x as 3.3.x is not fully tested.
     394
     395* numpy:
     396
     397  * 1.16.0: produces .gpx files that are not compatible with older
     398    version numpy versions. This is a pretty outmoded version; upgrade.
     399
     400'''
     401# add comments above when changing anything below
     402versionDict['tooOld'] = {'matplotlib': '1.'}
     403'modules that will certainly fail'
     404versionDict['tooOldWarn'] = {'wx': '2.'}
     405'modules that may fail but should be updated'
     406versionDict['badVersionWarn'] = {'numpy':['1.16.0'],
     407                                 'matplotlib': ['3.1','3.2']}
     408'versions of modules that are known to have bugs'
     409versionDict['tooNewWarn'] = {'matplotlib': '3.3'}
     410'module versions newer than what we have tested where problems are suspected'
     411   
    327412def ShowVersions():
    328413    '''Show the versions all of required Python packages, etc.
     
    337422    print ("Python module versions loaded:")
    338423    print ("  Python:     %s from %s"%(sys.version.split()[0],sys.executable))
    339     print ("  wx:         %s"%wx.__version__)
    340     print ("  matplotlib: %s"%mpl.__version__)
    341     print ("  numpy:      %s"%np.__version__)
    342     print ("  scipy:      %s"%sp.__version__)
    343     print ("  OpenGL:     %s"%ogl.__version__)
    344424    Image = None
    345425    version = '?'
     426    versionDict['errors'] = ''
     427    warn = False
     428    for s,m in [('wx',wx), ('matplotlib', mpl), ('numpy',np),
     429                    ('scipy',sp), ('OpenGL',ogl)]:
     430        msg = ''
     431        if s in versionDict['tooOld']:
     432            match = compareVersions(m.__version__,versionDict['tooOld'][s])
     433            if match <= 0:
     434                msg = "version will cause problems"
     435                warn = True
     436                if versionDict['errors']: versionDict['errors'] += '\n'
     437                versionDict['errors'] += 'Package {} version {} is too old for GSAS-II. An update is required'.format(s,m.__version__)
     438        if s in versionDict['tooOldWarn']:
     439            match = compareVersions(m.__version__,versionDict['tooOldWarn'][s])
     440            if match <= 0:
     441                msg = "version can cause problems"
     442                warn = True
     443        if s in versionDict['tooNewWarn']:
     444            match = compareVersions(m.__version__,versionDict['tooNewWarn'][s])
     445            if match >= 0:
     446                msg = "version is too new and could cause problems"
     447                warn = True
     448        if s in versionDict['badVersionWarn']:
     449            for v in versionDict['badVersionWarn'][s]:
     450                if compareVersions(m.__version__,v) == 0:
     451                    msg = "version is known to be buggy"
     452                    warn = True
     453                    break
     454        print("  {:12s}{}  {}".format(s+':',m.__version__,msg))
    346455    try:
    347456        from PIL import Image
     
    386495        print('Warning GSAS-II incompletely updated. Please contact toby@anl.gov')
    387496    # end patch
    388 
    389 def warnNumpyVersion(application):
    390     dlg = wx.MessageDialog(application.main,
    391                 'version '+ np.__version__ +
    392                 ' of numpy produces .gpx files that are not compatible with older versions: please upgrade or downgrade numpy to avoid this version',
    393                 'numpy Warning',wx.OK)
    394     try:
    395         dlg.CenterOnParent()
    396         dlg.ShowModal()
    397     finally:
    398         dlg.Destroy()
    399        
     497    if warn:
     498        print('You are suggested to install a new version of GSAS-II.\nSee https://bit.ly/G2install',
     499              '\n\nFor information on packages see\nhttps://gsas-ii.readthedocs.io/en/latest/packages.html and',
     500              '\nhttps://gsas-ii.readthedocs.io/en/latest/GSASIIGUI.html#GSASIIdataGUI.versionDict')
     501
    400502###############################################################################
    401503#### GUI creation
     
    405507    ShowVersions()
    406508    GUIpatches()
    407     knownVersions = ['2.7','3.6','3.7','3.8']
    408     if platform.python_version()[:3] not in knownVersions:
    409         dlg = wx.MessageDialog(None,
    410                 'GSAS-II requires Python 2.7.x or 3.6+\n Yours is '+sys.version.split()[0],
    411                 'Python version error',  wx.OK)
    412         try:
    413             dlg.ShowModal()
    414         finally:
    415             dlg.Destroy()
    416         sys.exit()
    417 
     509   
    418510    if platform.python_version()[:3] == '2.7':
    419511        msg = '''The end-of-life for python 2.7 was January 1, 2020.
     
    451543        txt = wx.StaticText(dlg,wx.ID_ANY,G2G.StripIndents(msg))
    452544        mainSizer.Add(txt)
    453         txt.Wrap(600)
     545        txt.Wrap(400)
    454546        dlg.SetSizer(mainSizer)
    455547        btnsizer = wx.BoxSizer(wx.HORIZONTAL)
     
    504596                GSASIIpath.runScript(cmds, wait=True)   
    505597                sys.exit()
     598    if versionDict['errors']:
     599        dlg = wx.MessageDialog(None, versionDict['errors']+
     600             '\n\nThe simplest solution is to install a new version of GSAS-II. '+
     601             'See https://bit.ly/G2install',
     602                'Python package problem',  wx.OK)
     603        try:
     604            dlg.ShowModal()
     605        finally:
     606            dlg.Destroy()
     607        sys.exit()
     608    elif platform.python_version()[:3] not in ['2.7','3.6','3.7','3.8','3.9']:
     609        dlg = wx.MessageDialog(None,
     610                'GSAS-II requires Python 2.7.x or 3.6+\n Yours is '+sys.version.split()[0],
     611                'Python version error',  wx.OK)
     612        try:
     613            dlg.ShowModal()
     614        finally:
     615            dlg.Destroy()
     616        sys.exit()
     617               
    506618    application.main = GSASII(None)  # application.main is the main wx.Frame (G2frame in most places)
    507619    application.SetTopWindow(application.main)
    508620    # save the current package versions
    509621    application.main.PackageVersions = G2fil.get_python_versions([wx, mpl, np, sp, ogl])
    510     if np.__version__ == '1.16.0':
    511         wx.CallLater(100,warnNumpyVersion,application)
    512622    if GSASIIpath.GetConfigValue('wxInspector'):
    513623        import wx.lib.inspection as wxeye
     
    89279037    else:
    89289038        G2frame.SetMenuBar(menu)
     9039
     9040if __name__ == '__main__':
     9041    ShowVersions()
  • trunk/GSASIIplot.py

    r4656 r4658  
    10591059            if Type in ['|DFsq|/sig','|DFsq|>sig','|DFsq|>3sig']:
    10601060                if A > 0.0:
    1061                     Plot.add_artist(Circle(xy,radius=A,ec='g',fc='w',pickradius=1.,gid=hid))
     1061                    Plot.add_artist(Circle(xy,radius=A,ec='g',fc='w',
     1062                                picker=True,pickradius=1.,gid=hid))
    10621063                else:
    1063                     Plot.add_artist(Circle(xy,radius=-A,ec='r',fc='w',pickradius=1.,gid=hid))
     1064                    Plot.add_artist(Circle(xy,radius=-A,ec='r',fc='w',
     1065                                picker=True,pickradius=1.,gid=hid))
    10641066            else:
    10651067                if A > 0.0 and A > B:
    10661068                    Plot.add_artist(Circle(xy,radius=A,ec='g',fc='w'))
    10671069                if B:
    1068                     Plot.add_artist(Circle(xy,radius=B,ec='b',fc='w',pickradius=1.,gid=hid))
     1070                    Plot.add_artist(Circle(xy,radius=B,ec='b',fc='w',
     1071                                picker=True,pickradius=1.,gid=hid))
    10691072                    if A < B:
    10701073                        Plot.add_artist(Circle(xy,radius=A,ec='g',fc='w'))
     
    23722375                backDict['FixedPoints'].append(xy)
    23732376                Plot = Page.figure.gca()
    2374                 Plot.plot(event.xdata,event.ydata,'rD',clip_on=Clip_on,pickradius=3.)
     2377                Plot.plot(event.xdata,event.ydata,'rD',clip_on=Clip_on,
     2378                                picker=True,pickradius=3.)
    23752379                Page.canvas.draw()
    23762380                return
     
    30623066                    if x > xmax:
    30633067                        continue
    3064                 magMarkers.append(Plot.axvline(x,color='0.5',dashes=(1,1),pickradius=2.,label='_magline'))
     3068                magMarkers.append(Plot.axvline(x,color='0.5',dashes=(1,1),
     3069                                picker=True,pickradius=2.,label='_magline'))
    30653070                lbl = Plot.annotate("x{}".format(ml), xy=(x, tpos), xycoords=("data", "axes fraction"),
    30663071                    verticalalignment='bottom',horizontalalignment=halign,label='_maglbl')
     
    31033108            elif Page.plotStyle['dPlot'] and 'PWDR' in plottype and not ifLimits:
    31043109                lims = G2lat.Pos2dsp(Parms,lims)
    3105             Lines.append(Plot.axvline(lims[0],color='g',dashes=(5,5),pickradius=3.))   
    3106             Lines.append(Plot.axvline(lims[1],color='r',dashes=(5,5),pickradius=3.))
     3110            Lines.append(Plot.axvline(lims[0],color='g',dashes=(5,5),
     3111                                    picker=True,pickradius=3.))   
     3112            Lines.append(Plot.axvline(lims[1],color='r',dashes=(5,5),
     3113                                    picker=True,pickradius=3.))   
    31073114            for i,item in enumerate(limits[2:]):
    3108                 Lines.append(Plot.axvline(item[0],color='m',dashes=(5,5),pickradius=3.))   
    3109                 Lines.append(Plot.axvline(item[1],color='m',dashes=(5,5),pickradius=3.))
     3115                Lines.append(Plot.axvline(item[0],color='m',dashes=(5,5),
     3116                                    picker=True,pickradius=3.))   
     3117                Lines.append(Plot.axvline(item[1],color='m',dashes=(5,5),
     3118                                    picker=True,pickradius=3.))
    31103119                exclLines += [2*i+2,2*i+3]
    31113120        if G2frame.Contour:           
     
    31993208                    else:
    32003209                        DZ = (xye[1]-xye[3])*np.sqrt(wtFactor*xye[2])
    3201                     DifLine = Plot1.plot(X,DZ,colors[3],pickradius=1.,label=incCptn('diff'))                    #(Io-Ic)/sig(Io)
     3210                    DifLine = Plot1.plot(X,DZ,colors[3],
     3211                        picker=True,pickradius=1.,label=incCptn('diff'))                    #(Io-Ic)/sig(Io)
    32023212                    Plot1.axhline(0.,color='k')
    32033213
     
    32053215                    if 'PWDR' in plottype:
    32063216                        Plot.set_yscale("log",nonposy='mask')
    3207                         Plot.plot(X,Y,marker=pP,color=colors[0],pickradius=3.,clip_on=Clip_on,label=incCptn('obs'))
     3217                        Plot.plot(X,Y,marker=pP,color=colors[0],
     3218                            picker=True,pickradius=3.,clip_on=Clip_on,label=incCptn('obs'))
    32083219                        if G2frame.SinglePlot or G2frame.plusPlot:
    32093220                            Plot.plot(X,Z,colors[1],picker=False,label=incCptn('calc'))
     
    32163227                            if Page.plotStyle['sqPlot']:
    32173228                                Plot.errorbar(X,YB,yerr=X**4*Sample['Scale'][0]*np.sqrt(1./(Pattern[0]['wtFactor']*xye[2])),
    3218                                     ecolor=colors[0],pickradius=3.,clip_on=Clip_on)
     3229                                    ecolor=colors[0],
     3230                                picker=True,pickradius=3.,clip_on=Clip_on)
    32193231                            else:
    32203232                                Plot.errorbar(X,YB,yerr=Sample['Scale'][0]*np.sqrt(1./(Pattern[0]['wtFactor']*xye[2])),
    3221                                     ecolor=colors[0],pickradius=3.,clip_on=Clip_on,label=incCptn('obs'))
     3233                                    ecolor=colors[0],
     3234                                picker=True,pickradius=3.,clip_on=Clip_on,label=incCptn('obs'))
    32223235                        else:
    3223                             Plot.plot(X,YB,marker=pP,color=colors[0],pickradius=3.,clip_on=Clip_on,label=incCptn('obs'))
     3236                            Plot.plot(X,YB,marker=pP,color=colors[0],
     3237                                picker=True,pickradius=3.,clip_on=Clip_on,label=incCptn('obs'))
    32243238                        Plot.plot(X,W,colors[1],picker=False,label=incCptn('bkg'))     #const. background
    32253239                        Plot.plot(X,ZB,colors[2],picker=False,label=incCptn('calc'))
     
    32273241                    if G2frame.SubBack:
    32283242                        if 'PWDR' in plottype:
    3229                             ObsLine = Plot.plot(Xum,Y,color=colors[0],marker=pP,picker=False,clip_on=Clip_on,label=incCptn('obs-bkg'))  #Io-Ib
     3243                            ObsLine = Plot.plot(Xum,Y,color=colors[0],marker=pP,
     3244                                picker=False,clip_on=Clip_on,label=incCptn('obs-bkg'))  #Io-Ib
    32303245                            if np.any(Z):       #only if there is a calc pattern
    32313246                                CalcLine = Plot.plot(X,Z-W,colors[1],picker=False,label=incCptn('calc-bkg'))               #Ic-Ib
    32323247                        else:
    3233                             Plot.plot(X,YB,color=colors[0],marker=pP,pickradius=3.,clip_on=Clip_on,label=incCptn('obs'))
     3248                            Plot.plot(X,YB,color=colors[0],marker=pP,
     3249                                picker=True,pickradius=3.,clip_on=Clip_on,label=incCptn('obs'))
    32343250                            Plot.plot(X,ZB,colors[2],picker=False,label=incCptn('calc'))
    32353251                    else:
    32363252                        if 'PWDR' in plottype:
    3237                             ObsLine = Plot.plot(Xum,Y,color=colors[0],marker=pP,pickradius=3.,clip_on=Clip_on,label=incCptn('obs'))    #Io
     3253                            ObsLine = Plot.plot(Xum,Y,color=colors[0],marker=pP,
     3254                                picker=True,pickradius=3.,clip_on=Clip_on,label=incCptn('obs'))    #Io
    32383255                            CalcLine = Plot.plot(X,Z,colors[1],picker=False,label=incCptn('calc'))                 #Ic
    32393256                        else:
    3240                             Plot.plot(X,YB,color=colors[0],marler=pP,pickradius=3.,clip_on=Clip_on,label=incCptn('obs'))
     3257                            Plot.plot(X,YB,color=colors[0],marler=pP,
     3258                                picker=True,pickradius=3.,clip_on=Clip_on,label=incCptn('obs'))
    32413259                            Plot.plot(X,ZB,colors[2],picker=False,label=incCptn('calc'))
    32423260                    if 'PWDR' in plottype and (G2frame.SinglePlot and G2frame.plusPlot):
    32433261                        BackLine = Plot.plot(X,W,colors[2],picker=False,label=incCptn('bkg'))                 #Ib
    32443262                        if not G2frame.Weight and np.any(Z):
    3245                             DifLine = Plot.plot(X,D,colors[3],pickradius=1.,label=incCptn('diff'))                 #Io-Ic
     3263                            DifLine = Plot.plot(X,D,colors[3],
     3264                                picker=True,pickradius=1.,label=incCptn('diff'))                 #Io-Ic
    32463265                    Plot.axhline(0.,color='k',label='_zero')
    32473266                Page.SetToolTipString('')
     
    32613280                                Ni = N
    32623281                            if Page.plotStyle['qPlot']:
    3263                                 Lines.append(Plot.axvline(2.*np.pi/G2lat.Pos2dsp(Parms,item[0]),color='b',pickradius=2.))
     3282                                Lines.append(Plot.axvline(2.*np.pi/G2lat.Pos2dsp(Parms,item[0]),color='b',
     3283                                    picker=True,pickradius=2.))
    32643284                            elif Page.plotStyle['dPlot']:
    3265                                 Lines.append(Plot.axvline(G2lat.Pos2dsp(Parms,item[0]),color='b',pickradius=2.))
     3285                                Lines.append(Plot.axvline(G2lat.Pos2dsp(Parms,item[0]),color='b',
     3286                                    picker=True,pickradius=2.))
    32663287                            else:
    3267                                 Lines.append(Plot.axvline(item[0],color='b',pickradius=2.))
     3288                                Lines.append(Plot.axvline(item[0],color='b',
     3289                                    picker=True,pickradius=2.))
    32683290                            if Ni == N+1:
    32693291                                Lines[-1].set_lw(Lines[-1].get_lw()+1)
     
    32773299                if Page.plotStyle['logPlot']:
    32783300                    if 'PWDR' in plottype:
    3279                         Plot.semilogy(X,Y,color=mcolors.cmap(icolor),picker=False,nonposy='mask')
     3301                        Plot.semilogy(X,Y,color=mcolors.cmap(icolor),
     3302                                          picker=False,nonposy='mask')
    32803303                    elif plottype in ['SASD','REFD']:
    3281                         Plot.semilogy(X,Y,color=mcolors.cmap(icolor),picker=False,nonposy='mask')
     3304                        Plot.semilogy(X,Y,color=mcolors.cmap(icolor),
     3305                                          picker=False,nonposy='mask')
    32823306                else:
    32833307                    if 'PWDR' in plottype:
    32843308                        Plot.plot(X,Y,color=mcolors.cmap(icolor),picker=False)
    32853309                    elif plottype in ['SASD','REFD']:
    3286                         Plot.loglog(X,Y,mcolors.cmap(icolor),picker=False,nonposy='mask')
     3310                        Plot.loglog(X,Y,mcolors.cmap(icolor),
     3311                                        picker=False,nonposy='mask')
    32873312                        Plot.set_ylim(bottom=np.min(np.trim_zeros(Y))/2.,top=np.max(Y)*2.)
    32883313                           
     
    33433368                plsym = Page.phaseColors[phase]+'|' # yellow should never happen!
    33443369                if Page.plotStyle['qPlot']:
    3345                     Page.tickDict[phase],j = Plot.plot(2*np.pi/peak.T[0],pos,plsym,mew=w,ms=l,pickradius=3.,label=phase)
     3370                    Page.tickDict[phase],j = Plot.plot(2*np.pi/peak.T[0],pos,plsym,mew=w,ms=l,
     3371                                picker=True,pickradius=3.,label=phase)
    33463372                elif Page.plotStyle['dPlot']:
    3347                     Page.tickDict[phase],j = Plot.plot(peak.T[0],pos,plsym,mew=w,ms=l,pickradius=3.,label=phase)
     3373                    Page.tickDict[phase],j = Plot.plot(peak.T[0],pos,plsym,mew=w,ms=l,
     3374                                picker=True,pickradius=3.,label=phase)
    33483375                else:
    3349                     Page.tickDict[phase],j = Plot.plot(peak.T[1],pos,plsym,mew=w,ms=l,pickradius=3.,label=phase)
     3376                    Page.tickDict[phase],j = Plot.plot(peak.T[1],pos,plsym,mew=w,ms=l,
     3377                                picker=True,pickradius=3.,label=phase)
    33503378            handles,legends = Plot.get_legend_handles_labels()  #got double entries in the phase legends for some reason
    33513379            if handles:
     
    34013429                else:
    34023430                    break
    3403             Plot.plot(x,y,'rD',clip_on=Clip_on,pickradius=3.)
     3431            Plot.plot(x,y,'rD',clip_on=Clip_on,picker=True,pickradius=10.)
    34043432    if not newPlot:
    34053433        # this restores previous plot limits (but I'm not sure why there are two .push_current calls)
     
    47824810            X = XYlist[0].T[0]
    47834811            Y = XYlist[0].T[1]
    4784             Plot.plot(X,Y,color='b',pickradius=3)
     4812            Plot.plot(X,Y,color='b',picker=True,pickradius=3)
    47854813            if 'calc' in Peaks and len(Peaks['calc']):
    47864814                XC,YC= Peaks['calc']
    47874815                Plot.plot(XC,YC,color='g')
    4788             G2frame.Lines.append(Plot.axvline(peaks['Limits'][0],color='g',dashes=(5,5),pickradius=2.))
    4789             G2frame.Lines.append(Plot.axvline(peaks['Limits'][1],color='r',dashes=(5,5),pickradius=2.))
     4816            G2frame.Lines.append(Plot.axvline(peaks['Limits'][0],color='g',dashes=(5,5),
     4817                                picker=True,pickradius=2.))
     4818            G2frame.Lines.append(Plot.axvline(peaks['Limits'][1],color='r',dashes=(5,5),
     4819                                picker=True,pickradius=2.))
    47904820            for peak in Peaks['Peaks']:
    4791                 G2frame.Lines.append(Plot.axvline(peak[0],color='r',pickradius=2.))
     4821                G2frame.Lines.append(Plot.axvline(peak[0],color='r',
     4822                                picker=True,pickradius=2.))
    47924823            Xb = [0.,peaks['Limits'][1]]
    47934824            Yb = [0.,Xb[1]*peaks['Background'][1][1]]
     
    48724903            Plot.errorbar(X,Y,ecolor='k',yerr=E)
    48734904        if ixy:
    4874             Plot.plot(X,Y,'kx',pickradius=3)
     4905            Plot.plot(X,Y,'kx',picker=True,pickradius=3)
    48754906        else:
    48764907            Plot.plot(X,Y,'kx',label='peak')
     
    52895320        colors = list(np.where(np.array(Probs1)>thresh[0][1],'r','b'))
    52905321        resNums = np.arange(len(resNames))
    5291         Plot1.bar(resNums,Probs1,color=colors,linewidth=0,pickradius=1)
     5322        Plot1.bar(resNums,Probs1,color=colors,linewidth=0,
     5323                                picker=True,pickradius=1)
    52925324        if thresh is not None:
    52935325            for item in thresh[0]:
     
    52975329        Plot2.set_xlabel(r'Residue',fontsize=14)       
    52985330        colors = list(np.where(np.array(Probs2)>thresh[1][1],'r','b'))
    5299         Plot2.bar(resNums,Probs2,color=colors,linewidth=0,pickradius=1)
     5331        Plot2.bar(resNums,Probs2,color=colors,linewidth=0,
     5332                                picker=True,pickradius=1)
    53005333        if thresh is not None:
    53015334            for item in thresh[1]:
     
    60436076        acolor = mpl.cm.get_cmap(G2frame.ContourColor)
    60446077        Img = Plot.imshow(Z.T,aspect='equal',cmap=acolor,extent=[-1,1,-1,1])
    6045         Plot.plot(y,x,'+',pickradius=3)
     6078        Plot.plot(y,x,'+',picker=True,pickradius=3)
    60466079        Page.figure.colorbar(Img)
    60476080        Plot.axis('off')
     
    62386271                Ydet = list(npsind(Pdet)*Rdet)
    62396272                for i,[x,y] in enumerate(zip(Xdet,Ydet)):
    6240                     Plot.plot(x,-y,'k+',pickradius=5,gid=textureData['det Angles'][i][0])
     6273                    Plot.plot(x,-y,'k+',
     6274                                picker=True,pickradius=5,gid=textureData['det Angles'][i][0])
    62416275            h,k,l = SHData['PFhkl']
    62426276            Plot.axis('off')
     
    65206554    if len(Angles):
    65216555        Eval = np.array([-G2mth.calcTorsionEnergy(x,Coeff)[1] for x in Angles])
    6522         Plot.plot(Angles,Eval,'ro',pickradius=5)
     6556        Plot.plot(Angles,Eval,'ro',picker=True,pickradius=5)
    65236557    Plot.set_xlim((0.,360.))
    65246558    Plot.set_title('Torsion angles for '+TorName+' in '+phaseName)
     
    66016635            PhiPsi = np.where(PhiPsi>180.,PhiPsi-360.,PhiPsi)
    66026636            Phi,Psi = PhiPsi.T
    6603             Plot.plot(Phi,Psi,'ro',pickradius=5)
     6637            Plot.plot(Phi,Psi,'ro',picker=True,pickradius=5)
    66046638        Plot.set_xlim((-180.,180.))
    66056639        Plot.set_ylim((-180.,180.))
     
    66136647        if len(PhiPsi):
    66146648            Phi,Psi = PhiPsi.T
    6615             Plot.plot(Phi,Psi,'ro',pickradius=5)
     6649            Plot.plot(Phi,Psi,'ro',picker=True,pickradius=5)
    66166650        Plot.set_xlim((0.,360.))
    66176651        Plot.set_ylim((0.,360.))
     
    70287062                spot = [event.xdata,event.ydata,G2frame.spotSize]
    70297063                Masks['Points'].append(spot)
    7030                 artist = Circle(spot[:2],radius=spot[2]/2,fc='none',ec='r',pickradius=3)
     7064                artist = Circle(spot[:2],radius=spot[2]/2,fc='none',ec='r',
     7065                                picker=True,pickradius=3)
    70317066                Page.figure.gca().add_artist(artist)
    70327067                artist.itemNumber = len(Masks['Points'])-1
     
    74607495                    spot = [Xpos,Ypos,sig]
    74617496                    Masks['Points'].append(spot)
    7462                     artist = Circle((Xpos,Ypos),radius=spot[2]/2,fc='none',ec='r',pickradius=3)
     7497                    artist = Circle((Xpos,Ypos),radius=spot[2]/2,fc='none',ec='r',
     7498                                picker=True,pickradius=3)
    74637499                    Page.figure.gca().add_artist(artist)
    74647500                    artist.itemNumber = len(Masks['Points'])-1
     
    77577793                    xyI = np.array(xyI)
    77587794                    arcxI,arcyI = xyI.T
    7759                     Plot.plot(arcxI,arcyI,pickradius=3,label='Itth')
     7795                    Plot.plot(arcxI,arcyI,picker=True,pickradius=3,label='Itth')
    77607796            if ellO:
    77617797                xyO = []
     
    77687804                    xyO = np.array(xyO)
    77697805                    arcxO,arcyO = xyO.T               
    7770                     Plot.plot(arcxO,arcyO,pickradius=3,label='Otth')
     7806                    Plot.plot(arcxO,arcyO,picker=True,pickradius=3,label='Otth')
    77717807            if ellO and ellI and len(arcxO):
    7772                 Plot.plot([arcxI[0],arcxO[0]],[arcyI[0],arcyO[0]],pickradius=3,label='Lazm')
    7773                 Plot.plot([arcxI[-1],arcxO[-1]],[arcyI[-1],arcyO[-1]],pickradius=3,label='Uazm')
     7808                Plot.plot([arcxI[0],arcxO[0]],[arcyI[0],arcyO[0]],
     7809                                picker=True,pickradius=3,label='Lazm')
     7810                Plot.plot([arcxI[-1],arcxO[-1]],[arcyI[-1],arcyO[-1]],
     7811                                picker=True,pickradius=3,label='Uazm')
    77747812            for i in range(Nazm):
    77757813                cake = LRAzim[0]+i*delAzm-AzmthOff
     
    77877825            dspO = wave/(2.0*sind(IOtth[1]/2.0))
    77887826            xyO = G2img.GetDetectorXY(dspO,azm,Data)
    7789             Plot.plot([xyI[0],xyO[0]],[xyI[1],xyO[1]],pickradius=3,label='linescan')
     7827            Plot.plot([xyI[0],xyO[0]],[xyI[1],xyO[1]],
     7828                                picker=True,pickradius=3,label='linescan')
    77907829                   
    77917830        if G2frame.PickId and G2frame.GPXtree.GetItemText(G2frame.PickId) in ['Image Controls',]:
    77927831            for xring,yring in Data['ring']:
    7793                 Plot.plot(xring,yring,'r+',pickradius=3)
     7832                Plot.plot(xring,yring,'r+',picker=True,pickradius=3)
    77947833            if Data['setRings']:
    77957834                N = 0
     
    78157854            if len(spot):
    78167855                x,y,d = spot
    7817                 artist = Circle((x,y),radius=d/2,fc='none',ec='r',pickradius=3)
     7856                artist = Circle((x,y),radius=d/2,fc='none',ec='r',
     7857                                picker=True,pickradius=3)
    78187858                Plot.add_artist(artist)
    78197859                artist.itemNumber = i
     
    78267866                wave = Data['wavelength']
    78277867                (x1,y1),(x2,y2) = ComputeArc(tth-thick/2.,tth+thick/2.,wave)
    7828                 artistO, = Plot.plot(x1,y1,'r',pickradius=3) 
     7868                artistO, = Plot.plot(x1,y1,'r',picker=True,pickradius=3) 
    78297869                artistO.itemNumber = iring
    78307870                artistO.itemType = 'RingOuter'
    7831                 artistI, = Plot.plot(x2,y2,'r',pickradius=3)
     7871                artistI, = Plot.plot(x2,y2,'r',picker=True,pickradius=3)
    78327872                artistI.itemNumber = iring
    78337873                artistI.itemType = 'RingInner'
     
    78427882                (x1,y1),(x2,y2) = ComputeArc(tth-thick/2.,tth+thick/2.,wave,azm[0],azm[1])
    78437883                arcList = []
    7844                 arcList.append(Plot.plot(x2,y2,'r',pickradius=3)[0]) # 'inner'
     7884                arcList.append(Plot.plot(x2,y2,'r',picker=True,pickradius=3)[0]) # 'inner'
    78457885                arcList[-1].itemNumber = iarc
    78467886                arcList[-1].itemType = 'ArcInner'
    7847                 arcList.append(Plot.plot(x1,y1,'r',pickradius=3)[0]) # 'outer'           
     7887                arcList.append(Plot.plot(x1,y1,'r',picker=True,pickradius=3)[0]) # 'outer'           
    78487888                arcList[-1].itemNumber = iarc
    78497889                arcList[-1].itemType = 'ArcOuter'         
    7850                 arcList.append(Plot.plot([x1[0],x2[0]],[y1[0],y2[0]],'r',pickradius=3)[0]) # 'lower'
     7890                arcList.append(Plot.plot([x1[0],x2[0]],[y1[0],y2[0]],'r',
     7891                                picker=True,pickradius=3)[0]) # 'lower'
    78517892                arcList[-1].itemNumber = iarc
    78527893                arcList[-1].itemType = 'ArcLower'
    7853                 arcList.append(Plot.plot([x1[-1],x2[-1]],[y1[-1],y2[-1]],'r',pickradius=3)[0]) # 'upper'
     7894                arcList.append(Plot.plot([x1[-1],x2[-1]],[y1[-1],y2[-1]],'r',
     7895                                picker=True,pickradius=3)[0]) # 'upper'
    78547896                arcList[-1].itemNumber = iarc
    78557897                arcList[-1].itemType = 'ArcUpper'
     
    78657907            G2frame.polyList.append(Plot.plot(xl,yl,'r')[0])            # line
    78667908            for i,(x,y) in enumerate(zip(xl[:-1],yl[:-1])):
    7867                 artist = Plot.plot(x,y,'r+',pickradius=10)[0] # point (plus sign)
     7909                artist = Plot.plot(x,y,'r+',picker=True,pickradius=10)[0] # point (plus sign)
    78687910                artist.itemNumber = ipoly
    78697911                artist.itemType = 'Polygon'
     
    78797921            G2frame.frameArtist = Plot.plot(xl,yl,'g')[0]
    78807922            for i,(x,y) in enumerate(zip(xl[:-1],yl[:-1])):
    7881                 artist = Plot.plot(x,y,'g+',pickradius=10)[0] # point (plus sign)
     7923                artist = Plot.plot(x,y,'g+',picker=True,pickradius=10)[0] # point (plus sign)
    78827924                artist.itemType = 'Frame'
    78837925                artist.pointNumber = i
  • trunk/docs/source/packages.rst

    r4001 r4658  
    1717We do some testing using the older Enthought Python Distribution
    1818(EPD); this is known to have some problems with reading CIFs and
    19 encourage updating from that.
     19encourage updating from that.
     20
     21More details on allowed and prefered package versions can be found in
     22the documentation for variable :attr:`GSASIIdataGUI.versionDict`.
    2023
    2124GUI Requirements
Note: See TracChangeset for help on using the changeset viewer.